簡體   English   中英

多處理程序(生產者-消費者)退出而不打印任何內容 Python 3

[英]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()中指定的參數。 每個都需要三個參數。 但是, producerDetailsconsumerDetails列表直接傳遞給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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM