问题描述
我有这个文件(它没有做任何有用的工作,它只是为了学习):
I have this file (it doesn't make any useful work, it's only for learning):
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()
以这种形式完美运行:
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
但如果我放在文件末尾而不是
but if I put in end of file instead of
if __name__ == '__main__': parent()
只有
parent()
它属于循环...
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):
为什么?!这个 if 子句有什么不同?
Why?! What different makes this if clause?
推荐答案
这是 MS Windows 上 multiprocessing 的问题:主模块由子任务导入,因此任何代码不受保护if __name__ ... 子句再次运行,导致无限循环.
This is an issue with multiprocessing on MS Windows: the main module is imported by the child tasks, so any code not protected by the if __name__ . . . clause gets run again, resulting in an infinite loop.