为了账号安全,请及时绑定邮箱和手机立即绑定

多处理程序(生产者-消费者)退出而不打印任何内容 Python 3

多处理程序(生产者-消费者)退出而不打印任何内容 Python 3

慕的地6264312 2023-08-08 16:47:32
我正在尝试创建共享队列,从中获取任务以执行并推送执行。但是,程序不会打印任何内容并以代码 0 退出。我正在使用 python 3.6 并尝试了我在互联网上找到的所有内容,但它不起作用。也许我错过了什么或者做错了什么。请指出正确的方向。import multiprocessing as mpimport timedef produce(i, rate, taskQue):    print("+++ Producer:%s +++" % i)    time.sleep(0.01)    for r in range(rate):        taskQue.put(0)    time.sleep(1)def consume(i, rate, taskQue):    print("--- Consumer:%s ---" % i)    for r in range(rate):        while taskQue.empty():            print("| Consumer:%s ..." % i)            time.sleep(0.5)        time.sleep(0.01)        taskQue.get()    time.sleep(1)if __name__ == '__main__':    manager = mp.Manager()    taskQue = manager.Queue()    producerDetails = [[1, 5, taskQue], [2, 7, taskQue], [3, 2, taskQue], [4, 3, taskQue]]    producerPool = mp.Pool(processes=5)    produced = producerPool.apply_async(produce, producerDetails)    consumerDetails = [[1, 5, taskQue], [2, 5, taskQue], [3, 3, taskQue], [4, 5, taskQue]]    consumerPool = mp.Pool(processes=5)    consumed = consumerPool.apply_async(consume, consumerDetails)    producerPool.close()    producerPool.join()    consumerPool.close()    consumerPool.join()
查看完整描述

1 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

我已经知道我做错了什么了。问题是池工作线程无法获取produce()和中指定的参数consume()。每个都需要三个参数。但是,producerDetails列表会作为子列表中的一个而不是三个单独的参数consumerDetails直接传递到映射列表。Pool.apply_async()


为此,有Pool.starmap()一些Pool.starmap_async()函数可以正确接受当前列表和地图参数。


如果有人不明白我上面的意思,这里是 Python 3.6 中的工作代码


import multiprocessing as mp

import time



def produce(i, rate, taskQue):

    for r in range(rate):

        print("+++ Producer:%s +++" % i)

        time.sleep(i * 0.01)

        taskQue.put(0)

    time.sleep(1)



def consume(i, rate, taskQue):

    for r in range(rate):

        while taskQue.empty():

            print("| Consumer:%s ..." % i)

            time.sleep(0.5)

        print("--- Consumer:%s ---" % i)

        time.sleep(i*0.01)

        taskQue.get()

    time.sleep(1)


if __name__ == '__main__':

    manager = mp.Manager()

    taskQue = manager.Queue()


    producerDetails = [[1, 5, taskQue], [2, 7, taskQue], [3, 2, taskQue], [4, 3, taskQue]]*50     

    producerPool = mp.Pool(processes=20)


    consumerDetails = [[1, 5, taskQue], [2, 5, taskQue], [3, 3, taskQue], [4, 5, taskQue]]*50

    consumerPool = mp.Pool(processes=20)


    produced = producerPool.starmap_async(produce, producerDetails)

    consumed = consumerPool.starmap_async(consume, consumerDetails)


    producerPool.close()

    producerPool.join()

    consumerPool.close()

    consumerPool.join()



查看完整回答
反对 回复 2023-08-08
  • 1 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信