答案其实很简单。您正在使用 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()
您也可以使用管理器,如另一个答案所示。这种方法的问题是可能会在进程地址空间之间发生大量隐式内存复制,这很难推理。我总是更喜欢使用显式队列。