簡體   English   中英

python-帶隊列的多處理

[英]python - multiprocessing with queue

這是下面的代碼,我將字符串放入隊列中,並希望dowork2做一些工作,並在shared_queue返回char

但是我總是一無所獲, while not shared_queue.empty()

請給我一點,謝謝。

import time
import multiprocessing as mp


class Test(mp.Process):

    def __init__(self, **kwargs):
        mp.Process.__init__(self)
        self.daemon = False
        print('dosomething')

    def run(self):
        manager = mp.Manager()
        queue = manager.Queue()
        shared_queue = manager.Queue()
        # shared_list = manager.list()
        pool = mp.Pool()
        results = []
        results.append(pool.apply_async(self.dowork2,(queue,shared_queue)))
        while True:
            time.sleep(0.2)
            t =time.time()
            queue.put('abc')
            queue.put('def')
            l = ''
            while not shared_queue.empty():
                l = l + shared_queue.get()
            print(l)
            print( '%.4f' %(time.time()-t))

        pool.close()
        pool.join()

    def dowork2(queue,shared_queue):
        while True:
            path = queue.get()
            shared_queue.put(path[-1:])

if __name__ == '__main__':
    t = Test()
    t.start()
    # t.join()
    # t.run()

我設法通過將dowork2移到班級之外來使其正常工作。 如果您在Test類之前將dowork2聲明為一個函數,並將其調用為

results.append(pool.apply_async(dowork2, (queue, shared_queue)))

它按預期工作。 我不確定100%,但是它可能出錯了,因為您的Test類已經在子類化Process。 現在,當您的池創建一個子流程並在該子流程中初始化相同的類時,某些地方會被覆蓋。

總的來說,我想知道Pool是否真的是您要在這里使用的。 您的工作程序似乎處於無限循環中,表明您不希望該工作程序返回任何值,而只是返回隊列中的結果。 在這種情況下,您可以刪除池。

當我報廢Pool並替換為另一個子流程時,我還設法使它的工作功能保持在類內:

foo = mp.Process(group=None, target=self.dowork2, args=(queue, shared_queue))
foo.start()
# results.append(pool.apply_async(Test.dowork2, (queue, shared_queue)))
while True:
    ....

(不過,您需要將self添加到您的worker中,或將其聲明為靜態方法:)

def dowork2(self, queue, shared_queue):

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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