[英]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.