python多进程manager,使用管理器更新Python多进程中的队列

I am designing a Python multiprocessing code to work in a queue that might be updated along the processing. The following code sometimes works, or get stuck, or rises an Empty error.

import multiprocessing as mp

def worker(working_queue, output_queue):

while True:

if working_queue.empty() is True:

break

else:

picked = working_queue.get_nowait()

if picked % 2 == 0:

output_queue.put(picked)

else:

working_queue.put(picked+1)

return

if __name__ == '__main__':

manager = mp.Manager()

static_input = xrange(100)

working_q = manager.Queue()

output_q = mp.Queue()

for i in static_input:

working_q.put(i)

processes = [mp.Process(target=worker,args=(working_q, output_q)) for i in range(mp.cpu_count())]

for proc in processes:

proc.start()

for proc in processes:

proc.join()

results_bank = []

while True:

if output_q.empty() is True:

break

results_bank.append(output_q.get_nowait())

print len(results_bank) # length of this list should be equal to static_input, which is the range used to populate the input queue. In other words, this tells whether all the items placed for processing were actually processed.

results_bank.sort()

print results_bank

Should I use a list as a global variable, and lock it, instead of a manager.Queue()?

解决方案

I just added a try: and except Exception: to handle the Empty error. The results seem to be consistent now. Please let me know If you find problems I overlooked in this solution.

import multiprocessing as mp

def worker(working_queue, output_queue):

while True:

try:

if working_queue.empty() is True:

break

else:

picked = working_queue.get_nowait()

if picked % 2 == 0:

output_queue.put(picked)

else:

working_queue.put(picked+1)

except Exception:

continue

return

if __name__ == '__main__':

#Manager seem to be unnecessary.

#manager = mp.Manager()

#working_q = manager.Queue()

working_q = mp.Queue()

output_q = mp.Queue()

static_input = xrange(100)

for i in static_input:

working_q.put(i)

processes = [mp.Process(target=worker,args=(working_q, output_q)) for i in range(mp.cpu_count())]

for proc in processes:

proc.start()

for proc in processes:

proc.join()

results_bank = []

while True:

if output_q.empty() is True:

break

results_bank.append(output_q.get_nowait())

print len(results_bank) # length of this list should be equal to static_input, which is the range used to populate the input queue. In other words, this tells whether all the items placed for processing were actually processed.

results_bank.sort()

print results_bank

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值