gpt4 book ai didi

python - 在多处理期间保持统一计数?

转载 作者:太空宇宙 更新时间:2023-11-04 01:06:56 24 4
gpt4 key购买 nike

我有一个运行蒙特卡洛模拟的 Python 程序来寻找概率问题的答案。我正在使用多处理,这里是伪代码

import multiprocessing

def runmycode(result_queue):
print "Requested..."
while 1==1:
iterations +=1
if "result found (for example)":
result_queue.put("result!")

print "Done"

processs = []
result_queue = multiprocessing.Queue()

for n in range(4): # start 4 processes
process = multiprocessing.Process(target=runmycode, args=[result_queue])
process.start()
processs.append(process)

print "Waiting for result..."

result = result_queue.get() # wait

for process in processs: # then kill them all off
process.terminate()

print "Got result:", result

我想对此进行扩展,以便我可以统一计算已运行的迭代次数。就像如果线程 1 运行了 100 次并且线程 2 运行了 100 次那么我想显示总共 200 次迭代,作为控制台的打印。我指的是线程进程中的 iterations 变量。我怎样才能确保所有线程都添加到同一个变量?我认为使用 iterationsGlobal 版本会奏效,但事实并非如此。

最佳答案

普通的全局变量不像在线程之间共享那样在进程之间共享。您需要使用过程感知数据结构。对于您的用例,一个 multiprocessing.Value应该工作正常:

import multiprocessing

def runmycode(result_queue, iterations):
print("Requested...")
while 1==1: # This is an infinite loop, so I assume you want something else here
with iterations.get_lock(): # Need a lock because incrementing isn't atomic
iterations.value += 1
if "result found (for example)":
result_queue.put("result!")

print("Done")


if __name__ == "__main__":
processs = []
result_queue = multiprocessing.Queue()

iterations = multiprocessing.Value('i', 0)
for n in range(4): # start 4 processes
process = multiprocessing.Process(target=runmycode, args=(result_queue, iterations))
process.start()
processs.append(process)

print("Waiting for result...")

result = result_queue.get() # wait

for process in processs: # then kill them all off
process.terminate()

print("Got result: {}".format(result))
print("Total iterations {}".format(iterations.value))

一些注意事项:

  1. 我明确地将 Value 传递给子级,以保持代码与 Windows 兼容,Windows 不能在父级和子级之间共享读/写全局变量。
  2. 我用锁保护增量,因为它不是原子操作,并且容易出现竞争条件。
  3. 我添加了一个 if __name__ == "__main__": 守卫,同样是为了帮助实现 Windows 兼容性,并且作为一般的最佳实践。

关于python - 在多处理期间保持统一计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29921576/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com