Todo el código de ejemplo concurrent.futures está fallando con “BrokenProcessPool”

Estoy tratando de obtener una comprensión básica de esto antes de crear la aplicación real que necesito. Recientemente me mudé de 2.7 a 3.3.

Un copiado y pegado directo de este código de los documentos de Python falla, al igual que un ejemplo un poco más simple de aquí .

Este es mi código, derivado del segundo ejemplo:

import concurrent.futures nums = [1,2,3,4,5,6,7,8,9,10] def f(x): return x * x # Make sure the map and function are working print([val for val in map(f, nums)]) # Test to make sure concurrent map is working with concurrent.futures.ProcessPoolExecutor() as executor: for item in executor.map(f, nums): print(item) 

Y esta es la salida:

 [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] Traceback (most recent call last): File "", line 420, in run_nodebug File "", line 13, in  File "C:\Python33\lib\concurrent\futures\_base.py", line 546, in result_iterator yield future.result() File "C:\Python33\lib\concurrent\futures\_base.py", line 399, in result return self.__get_result() File "C:\Python33\lib\concurrent\futures\_base.py", line 351, in __get_result raise self._exception concurrent.futures.process.BrokenProcessPool: A process in the process pool was terminated abruptly while the future was running or pending. 

¿Cómo puedo hacer que este código funcione como se espera? Esperaba que los ejemplos simplemente funcionaran fuera de la caja.

Esto fue mi culpa, por dos razones:

  1. El código no estaba protegido, es decir, no if __name__
  2. La extraña Traceback fue porque el archivo no fue guardado. Nunca me causó un problema antes, pero lo hizo en este caso.

Corrigiendo ambos solucionamos el error.

Código de prueba final:

 import concurrent.futures nums = [1,2,3,4,5,6,7,8,9,10] def f(x): return x * x def main(): # Make sure the map and function are working print([val for val in map(f, nums)]) # Test to make sure concurrent map is working with concurrent.futures.ProcessPoolExecutor() as executor: print([val for val in executor.map(f, nums)]) if __name__ == '__main__': main() 

Salida, como se esperaba:

 [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 

Bajo Windows, es importante proteger el bucle principal del código para evitar la generación recursiva de subprocesos cuando se utiliza el ejecutor de procesos o cualquier otro código paralelo que genere nuevos procesos.

Básicamente, todo el código que crea nuevos procesos debe estar bajo if __name__ == '__main__': por el mismo motivo, no puede ejecutarlo en el intérprete.

Esto en realidad todavía está sucediendo en Windows. Tengo Python 3.7.2 y probé con el ejemplo dado en la documentación en https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor

El error sigue ocurriendo aunque el ejemplo ya tiene el nuevo proceso llamado desde __name__ == '__main__' .

Intenté esto en Windows 10 así como en Windows 7. Funciona como se anuncia en una Mac con MacOS Sierra. La misma versión de python.