python - 多处理程序(生产者-消费者)退出而不打印任何东西 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()
解决方案
我已经弄清楚我做错了什么。问题是 pool worker 不能接受在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()
推荐阅读
- php - 在 Wordpress 上使用 CSS 重叠两个图像的最有效方法是什么?
- mysql - Mysql:计算没有时间的日期
- javascript - Javascript在没有for循环的情况下在对象数组值中查找数组元素
- bash - 当第 4 列的值在数字范围内时提取行
- python - python上的Liferay portlet
- postgresql - postgres制作主键字符串+整数
- graphviz - 如何使用 GraphViz 或其他文本图处理器绘制直角三角形?
- java - 使用 Java 代码从指纹中提取细节点
- python - Raspberry Pi 3B+ 上的 Tensorflow Lite Python 绑定
- sql - 我想每月生成一份报告