importar y usar un módulo que usa multiprocesamiento sin causar un bucle infinito en Windows

Tengo un módulo llamado multi.py . Si simplemente quisiera ejecutar multi.py como un script, entonces la solución para evitar que se bloquee en Windows (generando un número infinito de procesos) es colocar el código de multiprocesamiento en:

 if __name__ == '__main__': 

Sin embargo, estoy intentando importarlo como un módulo desde otra secuencia de comandos y llamar a multi.start() . ¿Cómo se puede lograr esto?

 # multi.py import multiprocessing def test(x): x**=2 def start(): pool = multiprocessing.Pool(processes=multiprocessing.cpu_count()-2) pool.map(test, (i for i in range(1000*1000))) pool.terminate() print('done.') if __name__ == '__main__': print('runs as a script,',__name__) else: print('runs as imported module,',__name__) 

Este es mi test.py que ejecuto:

 # test.py import multi multi.start() 

No entiendo lo que me preguntas. No necesita hacer nada para evitar que esto genere infinitos procesos. Simplemente lo ejecuté en Windows XP, multi.start() el archivo y ejecuté multi.start() y se completó bien en un par de segundos.

La razón por la que tiene que hacer la if __name__=="__main__" es que, en Windows, el multiprocesamiento debe importar el script principal para ejecutar la función de destino, lo que significa que se ejecutará el código del módulo de nivel superior en ese archivo. El problema solo surge si el código del módulo de nivel superior intenta generar un nuevo proceso. En su ejemplo, el código del módulo de nivel superior no utiliza el multiprocesamiento, por lo que no hay una cadena de procesos infinita.

Edit: Ahora entiendo lo que estás pidiendo. No necesitas proteger multi.py . Necesitas proteger tu script principal, sea lo que sea. Si tiene una falla, es porque en su script principal está multi.start() en el código del módulo de nivel superior. Tu guión debe verse así:

 import multi if __name__=="__main__": multi.start() 

La “protección” siempre es necesaria en el script principal .

 if __name__ == '__main__': print('runs as a script,',__name__) else: print('runs as imported module,',__name__)