gpt4 book ai didi

python多处理同步更新字典

转载 作者:太空狗 更新时间:2023-10-30 01:51:54 25 4
gpt4 key购买 nike

我正在尝试通过多个进程更新一本通用词典。你能帮我找出这段代码有什么问题吗?我得到以下输出:

inside function
{1: 1, 2: -1}
comes here
inside function
{1: 0, 2: 2}
comes here
{1: 0, 2: -1}

谢谢。

from multiprocessing import Lock, Process, Manager

l= Lock()


def computeCopyNum(test,val):
l.acquire()
test[val]=val
print "inside function"
print test
l.release()
return

a=dict({1: 0, 2: -1})

procs=list()

for i in range(1,3):
p = Process(target=computeCopyNum, args=(a,i))
procs.append(p)
p.start()

for p in procs:
p.join()
print "comes here"

print a

最佳答案

其实答案很简单。您正在使用 multiprocessing 模块,您可以使用它启动几个不同的 python 进程。不同的进程有不同的地址空间并且它们不共享内存,所以你所有的进程都写入它们自己的本地字典副本。

使用多处理模块进行进程间通信的最简单方法是使用队列在从进程和主进程之间进行通信。

from multiprocessing import Process, Queue

def computeCopyNum(queue, val):
queue.put(val) # can also put a tuple of thread-id and value if we would like to

procs=list()

queue = Queue()
for i in range(1,3):
p = Process(target=computeCopyNum, args=(queue, i))
procs.append(p)
p.start()

for _ in procs:
val = queue.get()
# do whatever with val

for p in procs:
p.join()

如果每个从进程都可以生成多个输出值,那么让每个从进程向队列写入一个哨兵值以向主进程发出信号表示它已完成可能是明智的。那么代码可能类似于:

def slave(queue):
for i in range(128): # just for example
val = #some calculated result
queue.put(val)

queue.put(None) # add a sentinel value to tell the master we're done

queue = Queue()

# spawn 32 slave processes
num_procs = 32
procs = [Process(target=slave, args=(queue, )) for _ in range(num_procs)]
for proc in procs:
proc.start()

finished = 0
while finished < num_procs:
item = queue.get()
if item is None:
finished += 1
else:
# do something with item

for proc in procs:
proc.join()

您也可以使用经理,如另一个答案所示。这种方法的问题是可能会在进程地址空间之间发生大量隐式内存复制,这很难推理。我总是喜欢使用显式队列。

关于python多处理同步更新字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12538485/

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