Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多处理程序(生产者-消费者)退出而不打印任何内容_Python_Parallel Processing_Process_Multiprocessing - Fatal编程技术网

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

Python 多处理程序(生产者-消费者)退出而不打印任何内容,python,parallel-processing,process,multiprocessing,Python,Parallel Processing,Process,Multiprocessing,我正在尝试创建共享队列,从中执行任务并推送执行。但是,程序不打印任何内容,并以代码0退出 我正在使用Python3.6,并尝试了在internet上找到的所有东西,但它不起作用。也许我错过了什么或者做错了什么。请给我指一下正确的方向 import multiprocessing as mp import time def produce(i, rate, taskQue): print("+++ Producer:%s +++" % i) time.sle

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

我正在使用Python3.6,并尝试了在internet上找到的所有东西,但它不起作用。也许我错过了什么或者做错了什么。请给我指一下正确的方向

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

我已经知道我做错了什么。问题是池工作程序无法获取在
product()
consume()
中指定的参数。每个参数有三个参数。但是,
producerDetails
consumerDetails
列表直接传递到
池。apply_async()
将列表映射为子列表中的一个而不是三个单独的参数

为此,有
Pool.starmap()
Pool.starmap\u 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()

也许您不应该在完成之前关闭池?我在文档中读到,关闭池后,它将不接受更多的工作。它与池无关,实际上停止处理并终止所有进程。