使用 joblib.Parallel 并行化代碼時遇到問題。就結果而言,當后端threading按預期作業時,如下所示。這意味著兩者都print顯示了預期的結果。將后端更改multiprocessing為代碼時
- 跑得更快
- 第一張印刷品按預期作業
- 第二次列印(這是最終結果)是
None,完全忽略了它列印的內容
這是一個類似的MWE:
from joblib import Parallel, delayed
def E_th(i,tt,out_list):
out_list[tt] = tt i
print(out_list[tt])#>> prints correct results
return 1
if __name__ == "__main__":
time = range(0,10)
for i in range(0,2):
out_list = [None]*len(time)
Parallel(n_jobs=64,backend='threading')(delayed(E_th)(i,tt,out_list) for tt in range(len(time)))
print(out_list) #>> prints correct results
from joblib import Parallel, delayed
def E_th(i,tt,out_list):
out_list[tt] = tt i
print(out_list[tt])#>> prints correct results
return 1
if __name__ == "__main__":
time = range(0,10)
for i in range(0,2):
out_list = [None]*len(time)
Parallel(n_jobs=64,backend='multiprocessing')(delayed(E_th)(i,tt,out_list) for tt in range(len(time)))
print(out_list) #>> prints [None,None..]
我可能在這方面非常糟糕,所以如果有一種簡單的方法可以理解發生了什么,我會嘗試解決它:)
uj5u.com熱心網友回復:
多執行緒:out_list通過參考傳遞給子執行緒。因此,當他們更改它時,它會在所有執行緒中更改。
多行程out_list:(實際上是整個記憶體占用)被復制到子行程。因此,當子級更新串列時,更改不會傳播到發生列印的父級。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/496622.html
上一篇:重塑資料框并將值轉換為列
