python多处理正在丢失值

我尝试使用 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 +=1


with Pool(8) as p:

  p.map(some_func, all_rolls)

在 16 个内核上,我得到了 55,923,638 个值而不是 64,000,000


Helenr
浏览 120回答 2
2回答

沧海一幻觉

您需要使用Lock(请参阅本文)来保护您的值的修改。from multiprocessing import Locklock = Lock()def some_func(roll):    with lock:        if(comparison on rolls):            win.value += 1        elif(other comparison):            draw.value +=1        else:            loose.value +=1

绝地无双

除了@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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python