为什么在Pool中传递Queue对象无法运行

预期思路:

应用python的多进程模块,multiprocessing创建进程池执行某项统计任务,结果保存在queue对象中,主进程在所有子进程结束后读取该queue

from multiprocessing import Process, Queue, Pool

def func(msg, q):
   q.put(msg)


if __name__ == '__main__':
    pool = Pool(processes=4)
    q = Queue()
    for i in range(7):
        result = pool.apply_async(func, (i, q))
    pool.close()
    pool.join()
    print(result.successful())

    print(q.qsize())
运行结果为0,发现并没有子进程在执行。

但如果上例中去除Queue对象的使用,直接在func过程中 print(msg) 则正常执行


=====  补充 =====

如果不采用Queue保存子进程结果,换用Manager 处理共享变量

def countNum(records, q):
    counts = 0
    for line in records:    #统计传入列表字符串的长度总和
        counts += len(line)
    q.append(counts)

if __name__ == '__main__':
    row = 2    
    begin = 0
    
    manager = Manager()
    v_list = []<span style="white-space:pre">	</span>             # 共享列表
    v_list = manager.list()

    p = Pool(3)
    recs = linecache.getlines('tmp.txt')[begin:begin+row]    #每次取出文件的两行
    while recs:
        p.apply_async(countNum, (recs, v_list))
        begin += row
        recs = linecache.getlines('tmp.txt')[begin:begin+row]
    p.close()
    p.join()

    print(v_list)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值