为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 118 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信