2
如何並行化一個有if條件的for循環。如果滿足該條件,則不需要繼續循環。如果我可以爲此使用多處理,那將是非常好的。如何使用break處理語句爲Python for循環使用多處理?
for i in xrange(N):
x = do_something_with()
if x == 0:
break
上面的代碼可以在Python中並行嗎?
如何並行化一個有if條件的for循環。如果滿足該條件,則不需要繼續循環。如果我可以爲此使用多處理,那將是非常好的。如何使用break處理語句爲Python for循環使用多處理?
for i in xrange(N):
x = do_something_with()
if x == 0:
break
上面的代碼可以在Python中並行嗎?
作業處於活動狀態時,您可以終止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
注意,有些工作崗位開始但尚未完成。
關於這個'x' ....是依賴於在子進程中計算的東西的中斷條件,還是它只是父代中已知的一個條件? – tdelaney
你能詳細說明do_something_with()函數嗎? – jtitusj
我的錯誤可能是另一個變量返回值存儲在x中。編輯問題以反映這一變化。 –