2017-08-12 56 views
0

我有這樣的代碼:爲什麼多進程在目標函數之外運行?

import multiprocessing 
with open('pairs.txt') as f: 
    pairs = f.read().splitlines() 

print(pairs) 


def worker(pairtxt): 
    print(pairtxt) 

if __name__ == '__main__': 
    jobs = [] 
    for i in pairs: 
     p = multiprocessing.Process(target=worker, args=(i,)) 
     jobs.append(p) 
     p.start() 

當我運行這一點,對輸出變量(不pairtxt)3次,我被多一度猜測本身並兩次,但爲什麼它連外運行目標函數?

我輸出我用含2行 「1」 和 「2」 pairs.txt越來越

['1', '2'] 
['1', '2'] 
1 
['1', '2'] 
2 
+0

你想達到什麼目的?我們不知道什麼是在pairs.txt裏面:) –

+0

對於僅在函數上運行並輸出它們由「for i in pairs」分配的行的過程,它工作正常,但它打印的對意味着過程運行在函數之外,似乎在運行我的整個腳本。在pairs.txt裏面只有兩行簡單單詞。 – gregz11818

+0

我已經使用了pairs = [1,2]並運行代碼,它先打印「1」,然後打印「2」。 –

回答

1

嘗試with openprint(pairs)語句移動到您的if __name__ == '__main__'塊。

我懷疑python每次調用子進程時都會運行完整的腳本,因爲它希望確保所交付的函數的所有依賴關係(導入等)。通過在您的腳本中運行您的main塊以外的代碼,每次運行子進程時都會運行該代碼。

import multiprocessing 
def worker(pairtxt): 
    print(pairtxt) 

if __name__ == '__main__': 
    with open('pairs.txt') as f: 
     pairs = f.read().splitlines() 

    print(pairs) 
    jobs = [] 
    for i in pairs: 
     p = multiprocessing.Process(target=worker, args=(i,)) 
     jobs.append(p) 
     p.start() 
0

因爲Python是一種動態語言。在導入模塊時,該模塊中的所有頂層語句都會被執行。您通常不會注意到的原因是許多模塊只會聲明事物,或者至少在執行操作之前檢查它們是否是主要模塊。

在您的示例中,您甚至在定義了輔助函數之前,已經完全無條件加載文件並打印其內容。在多處理中,每個進程可能執行或不執行一次;它不會在fork可用的unixlikes上,因爲它們可以簡單地克隆現有進程而不是重新導入模塊。

這被記錄在Safe importing of main module之下,是一個多處理的頻繁問題。

相關問題