亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

python多處理正在丟失值

python多處理正在丟失值

Helenr 2021-08-24 15:16:08
我嘗試使用 multiprocessing 包中的 Pool 來加速計算。雖然我確實獲得了顯著的加速,但隨著核心/工人數量的增加,我丟失了越來越多的值。我通過 mp.value() 類與所有進程共享我的變量。我哪里出錯了,我該如何解決?poss = [x+1 for x in range(20)]all_rolls = itertools.product(poss, repeat=6)win = mp.Value('i', 0)draw = mp.Value('i', 0)loose = mp.Value('i', 0)def some_func(roll):  if(comparison on rolls):    win.value += 1  elif(other comparison):    draw.value +=1  else:    loose.value +=1with Pool(8) as p:  p.map(some_func, all_rolls)在 16 個內核上,我得到了 55,923,638 個值而不是 64,000,000
查看完整描述

2 回答

?
滄海一幻覺

TA貢獻1824條經驗 獲得超5個贊

您需要使用Lock(請參閱本文)來保護您的值的修改。


from multiprocessing import Lock


lock = Lock()


def some_func(roll):

    with lock:

        if(comparison on rolls):

            win.value += 1

        elif(other comparison):

            draw.value +=1

        else:

            loose.value +=1


查看完整回答
反對 回復 2021-08-24
?
絕地無雙

TA貢獻1946條經驗 獲得超4個贊

除了@jfowkes 回答的內容之外,請注意,您可以將每個 Value 與自己的鎖一起使用,這可能會使事情變得更快:


win = mp.Value('i', lock = True)

draw = mp.Value('i', lock = True)

loose = mp.Value('i', lock = True)


def some_func(roll):

    if(comparison on rolls):

        with win.get_lock() : 

            win.value += 1

    elif(other comparison):

        with draw.get_lock():

            draw.value +=1

    else:

        with loose.get_lock():

            loose.value +=1


查看完整回答
反對 回復 2021-08-24
  • 2 回答
  • 0 關注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號