Python 多处理程序(生产者-消费者)退出而不打印任何内容
我正在尝试创建共享队列,从中执行任务并推送执行。但是,程序不打印任何内容,并以代码0退出 我正在使用Python3.6,并尝试了在internet上找到的所有东西,但它不起作用。也许我错过了什么或者做错了什么。请给我指一下正确的方向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
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()
也许您不应该在完成之前关闭池?我在文档中读到,关闭池后,它将不接受更多的工作。它与池无关,实际上停止处理并终止所有进程。