python 多进程通信 同步 manager_python多进程同步更新字典

答案其实很简单。您正在使用多处理模块,使用该模块可以启动几个不同的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()

如果每个从进程都可以生成多个输出值,那么让每个从进程向队列写入一个sentinel值以向主进程发出它已经完成的信号可能是明智的。然后代码可能看起来像: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()

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值