[英]How do I make two different things happen at the same time in Python?
我習慣於多處理,但現在我遇到了一個問題,即mp.Pool
不是我需要的工具。
我有一個准備輸入的過程和另一個使用它的過程。 我沒有用完我所有的內核,所以我想讓兩個內核同時運行,第一個為下一次迭代准備批次。 我該怎么做呢? 而且(重要的是)這種東西叫什么,以便我可以去谷歌搜索?
這是一個虛擬示例。 以下代碼需要 8 秒:
import time
def make_input():
time.sleep(1)
return "cthulhu r'lyeh wgah'nagl fhtagn"
def make_output(input):
time.sleep(1)
return input.upper()
start = time.time()
for i in range(4):
input = make_input()
output = make_output(input)
print(output)
print(time.time() - start)
CTHULHU R'LYEH WGAH'NAGL FHTAGN
CTHULHU R'LYEH WGAH'NAGL FHTAGN
CTHULHU R'LYEH WGAH'NAGL FHTAGN
CTHULHU R'LYEH WGAH'NAGL FHTAGN
8.018263101577759
如果我在做輸出的同時准備輸入批次,則需要四秒鍾。 像這樣的東西:
next_input = make_input()
start = time.time()
for i in range(4):
res = do_at_the_same_time(
output = make_output(next_input),
next_input = make_input()
)
print(output)
print(time.time() - start)
但是,顯然,這是行不通的。 我怎樣才能完成我想要完成的事情?
重要說明:我嘗試了以下操作,但失敗了,因為執行工作人員在錯誤的范圍內工作(例如,對於我的實際用例)。 在我的虛擬用例中,它不起作用,因為它在不同的過程中打印。
def proc(i):
if i == 0:
return make_input()
if i == 1:
return make_output(next_input)
next_input = make_input()
for i in range(4):
pool = mp.Pool(2)
next_input = pool.map(proc, [0, 1])[0]
pool.close()
所以我需要一個解決方案,其中第二個進程發生在與 for 循環相同的范圍或環境中,並且第一個進程具有可以從該范圍獲得的輸出。
您應該能夠使用Pool
。 如果我理解正確,您希望一個工作人員為下一個運行並使用它做更多事情的工作人員准備輸入,鑒於您的示例功能,這應該這樣做:
pool = mp.Pool(2)
for i in range(4):
next_input = pool.apply(make_input)
pool.apply_async(make_output, (next_input, ), callback=print)
pool.close()
pool.join()
我們准備了一個有 2 個工人的池,現在我們想要運行循環來運行我們的兩個任務。
我們使用apply()
將make_input
委托給工作人員,等待函數完成將結果分配給next_input
。 注意:在這個例子中,我們可以使用單個工作池並只運行next_input = make_input()
(即在您的腳本運行的同一進程中並僅委托make_output()
)。
現在更有趣的一點:使用apply_async()
我們問一個工人跑make_output
,通過單一的參數next_input
到它,它告訴給欠幅(或任何功能) print
用的結果make_output
作為參數傳遞給函數注冊callback
.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.