下面是我的代码,我将字符串放入队列,并希望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()
答案 0 :(得分:1)
我设法通过在课堂外移动你的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):