python3.x ciclo de multiprocesamiento sin “if __name__ == ‘__main__’:”

Tengo este archivo (no hace ningún trabajo útil, es solo para aprender):

import multiprocessing,sys def parent(numproc=2): print ('at start') childs=[] print ('bfore Pipe') (parentEnd,childEnd)=multiprocessing.Pipe() i=0 print ('printing i:',i) child=multiprocessing.Process(target=child_proc, args=(childEnd,i)) print ('created child') child.start() print ('started child') print ('joining child') child.join() print ('joined child') print ('exeted from for i in childs') mins=[1,2] print ('task ended. result: ',min(mins)) def child_proc(pipe,name): pass if __name__ == '__main__': parent() 

en esta forma se ejecuta perfectamente:

 at start bfore Pipe printing i: 0 created child started child joining child joined child exeted from for i in childs task ended. result: 1 

pero si pongo en fin de archivo en lugar de

 if __name__ == '__main__': parent() 

solamente

 parent() 

cae en ciclo …

 at start bfore Pipe printing i: 0 created child started child joining child at start bfore Pipe printing i: 0 created child started child joining child at start bfore Pipe printing i: 0 created child started child joining child Traceback (most recent call last): 

¡¿Por qué?! ¿Qué diferencia hace esta cláusula if?

Este es un problema con el multiprocessing en MS Windows: el módulo principal es importado por las tareas secundarias, por lo que cualquier código no protegido por el if __name__ . . . if __name__ . . . La cláusula se ejecuta de nuevo, dando como resultado un bucle infinito.

El subproceso tiene el siguiente __name__ : __parents_main__ y no __main__ más. Es por esto que su proceso no se repite cuando está probando la variable __name__ .

Para obtener más información sobre esto, consulte el capítulo Importación segura del módulo principal