python - 使用队列进行多处理

时间:2018-01-26 15:17:36

标签: python multiprocessing

下面是我的代码,我将字符串放入队列,并希望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()

1 个答案:

答案 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):