2016-03-18 63 views
2

如何並行化一個有if條件的for循環。如果滿足該條件,則不需要繼續循環。如果我可以爲此使用多處理,那將是非常好的。如何使用break處理語句爲Python for循環使用多處理?

for i in xrange(N): 
    x = do_something_with() 
    if x == 0: 
     break 

上面的代碼可以在Python中並行嗎?

+0

關於這個'x' ....是依賴於在子進程中計算的東西的中斷條件,還是它只是父代中已知的一個條件? – tdelaney

+0

你能詳細說明do_something_with()函數嗎? – jtitusj

+0

我的錯誤可能是另一個變量返回值存儲在x中。編輯問題以反映這一變化。 –

回答

1

作業處於活動狀態時,您可以終止multiprocessing.Pool,並且它會終止子進程。如果您可以提前生成參數,則可以使用imap_unordered來提取結果並在條件滿足時終止池。處理池中其他作業的子進程被終止,因此它們不會返回其他結果。

import multiprocessing as mp 
import time 

def worker(x): 
    print('work item', x) 
    time.sleep(x) 
    result = x - 5 
    if result == 0: 
     print('termination condition') 
    print('work item', x, 'done') 
    return result 

if __name__ == '__main__': 
    p = mp.Pool(4) 
    for result in p.imap_unordered(worker, range(20), chunksize=1): 
     if result == 0: 
      print('terminating') 
      p.terminate() 
      break 
    print('done') 

結果

work item 0 
work item 1 
work item 0 done 
work item 4 
work item 3 
work item 2 
work item 1 done 
work item 5 
work item 2 done 
work item 6 
work item 3 done 
work item 7 
work item 4 done 
work item 8 
termination condition 
work item 5 done 
work item 9 
terminating 
done 

注意,有些工作崗位開始但尚未完成。