2012-07-16 37 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