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

我正在尝试创建共享队列,从中获取任务以执行并推送执行。但是,程序不会打印任何内容并以代码 0 退出。


我正在使用 python 3.6 并尝试了我在互联网上找到的所有内容,但它不起作用。也许我错过了什么或者做错了什么。请指出正确的方向。


import multiprocessing as mp

import time



def 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()


慕的地6264312
浏览 92回答 1
1回答

一只甜甜圈

我已经知道我做错了什么了。问题是池工作线程无法获取produce()和中指定的参数consume()。每个都需要三个参数。但是,producerDetails列表会作为子列表中的一个而不是三个单独的参数consumerDetails直接传递到映射列表。Pool.apply_async()为此,有Pool.starmap()一些Pool.starmap_async()函数可以正确接受当前列表和地图参数。如果有人不明白我上面的意思,这里是 Python 3.6 中的工作代码import multiprocessing as mpimport timedef 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()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python