Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

1.7K
Views
Multiprocesamiento de Python dentro de Jupyter Notebook

Soy nuevo en el módulo de multiprocessing en Python y trabajo con cuadernos Jupyter. Probé el siguiente fragmento de código de PMOTW :

 import multiprocessing def worker(): """worker function""" print('Worker') return if __name__ == '__main__': jobs = [] for i in range(5): p = multiprocessing.Process(target=worker) jobs.append(p) p.start()

Cuando ejecuto esto como está, no hay salida.

También intenté crear un módulo llamado worker.py y luego importarlo para ejecutar el código:

 import multiprocessing from worker import worker if __name__ == '__main__': jobs = [] for i in range(5): p = multiprocessing.Process(target=worker) jobs.append(p) p.start()

Todavía no hay salida en ese caso. En la consola, veo el siguiente error (repetido varias veces):

 Traceback (most recent call last): File "<string>", line 1, in <module> File "C:\Program Files\Anaconda3\lib\multiprocessing\spawn.py", line 106, in spawn_main exitcode = _main(fd) File "C:\Program Files\Anaconda3\lib\multiprocessing\spawn.py", line 116, in _main self = pickle.load(from_parent) AttributeError: Can't get attribute 'worker' on <module '__main__' (built-in)>

Sin embargo, obtengo el resultado esperado cuando el código se guarda como script de Python y se ejecuta.

¿Qué puedo hacer para ejecutar este código directamente desde el cuaderno sin crear un script separado?

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Soy relativamente nuevo en la computación paralela, por lo que puedo estar equivocado con algunos tecnicismos. Mi entendimiento es este:

Los cuadernos de Jupyter no funcionan con el multiprocessing porque el módulo recoge (serializa) los datos para enviarlos a los procesos. multiprocess es una bifurcación de multiprocessing que usa eneldo en lugar de pickle para serializar datos, lo que le permite trabajar desde dentro de los portátiles Jupyter. La API es idéntica, por lo que lo único que debe hacer es cambiar

 import multiprocessing

para...

 import multiprocess

Puede instalar multiprocess muy fácilmente con un simple

 pip install multiprocess

Sin embargo, encontrará que sus procesos aún no se imprimirán en la salida (aunque en los laboratorios de Jupyter se imprimirán en la terminal en la que se está ejecutando el servidor). Me topé con esta publicación tratando de solucionar esto y editaré esta publicación cuando descubra cómo hacerlo.

over 4 years ago · Santiago Trujillo Report

0

No soy un export ni en multiprocessing ni en ipykernel (que es el que usa jupyter notebook) pero como parece que nadie da una respuesta, les diré lo que adiviné. Espero que alguien complemente esto más adelante.

Supongo que su servidor portátil jupyter se está ejecutando en el host de Windows. En el multiprocesamiento existen tres métodos de inicio diferentes. Centrémonos en spawn , que es el predeterminado en Windows, y fork , el predeterminado en Unix.

Aquí hay una descripción general rápida.

  • Aparecer

    • (cpython) shell interactivo : siempre genera un error
    • ejecutar como un script ; está bien solo si anidaste el código de multiprocesamiento en if __name__ == '__main'__
  • Tenedor

    • siempre bien

Por ejemplo,

 import multiprocessing def worker(): """worker function""" print('Worker') return if __name__ == '__main__': multiprocessing.set_start_method('spawn') jobs = [] for i in range(5): p = multiprocessing.Process(target=worker) jobs.append(p) p.start()

Este código funciona cuando se guarda y se ejecuta como una secuencia de comandos, pero genera un error cuando se ingresa en un shell interactivo de python. Aquí está la implementación del kernel de ipython, y supongo que usa algún tipo de shell interactivo y, por lo tanto, no va bien con el spawn (pero no confíes en mí).


Como nota al margen, le daré una idea general de cómo el spawn y el tenedor son diferentes. Cada subproceso ejecuta un intérprete de Python diferente en multiprocesamiento. En particular, con spawn , un proceso hijo inicia un nuevo intérprete e importa el módulo necesario desde cero. Es difícil importar código en un shell interactivo, por lo que puede generar un error.

el tenedor es diferente. Con la bifurcación, un proceso secundario copia el proceso principal, incluida la mayoría de los estados de ejecución del intérprete de python, y luego continúa con la ejecución. Este código le ayudará a entender el concepto.

 import os main_pid = os.getpid() os.fork() print("Hello world(%d)" % os.getpid()) # print twice. Hello world(id1) Hello world(id2) if os.getpid() == main_pid: print("Hello world(main process)") # print once. Hello world(main process)
over 4 years ago · Santiago Trujillo Report

0

Esto funciona para mí en MAC (no puedo hacer que funcione en Windows):

 import multiprocessing as mp mp_start_count = 0 if __name__ == '__main__': if mp_start_count == 0: mp.set_start_method('fork') mp_start_count += 1
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!