2012-07-16 46 views
3

我有这个文件(它没有任何有用的工作,这只是学习):python3.x多处理循环没有“如果__name__ ==‘__main__’:”

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 

,但如果我把文件的末尾,而不是

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子句有什么不同?

+0

检查'if __name__'条件是什么意思... http://stackoverflow.com/questions/419163/what-does-if-name-main-do – avasal 2012-07-16 09:07:39

回答

5

这是multiprocessing在MS Windows的一个问题:主模块由子任务进口的,所以没有被if __name__ . . .条款保护的任何代码获取再次运行,导致无限循环。

2

该子流程具有以下__name____parents_main__而不是__main__。这就是为什么当您测试变量__name__时,您的过程不会循环。

有关这方面的详细信息,看看章节Safe importing of main module