![](/img/trans.png)
[英]Python multiprocessing possible deadlock with two queue as producer-consumer pattern?
[英]Multiprocessing program (producer-consumer) exits without printing anything 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()
我已經弄清楚我做錯了什么。 問題是池工作人員無法采用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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.