Python 3.5多处理池和队列不起作用

时间:2017-04-01 10:15:13

标签: python python-3.x multiprocessing

我遇到了多处理问题。代码包含在下面。代码可以按预期执行,但是当取消注释self.queue = multiprocessing.Queue()时,此程序将立即退出,似乎无法成功启动子进程。

我不知道发生了什么。有人可以帮帮我吗?非常感谢!

import multiprocessing
import time

class Test:
    def __init__(self):
        self.pool = multiprocessing.Pool(1)
        #self.queue = multiprocessing.Queue()

    def subprocess(self):
        for i in range(10):
            print("Running")
            time.sleep(1)
        print("Subprocess Completed")

    def start(self):
        self.pool.apply_async(func=self.subprocess)
        print("Subprocess has been started")
        self.pool.close()
        self.pool.join()

    def __getstate__(self):
        self_dict = self.__dict__.copy()
        del self_dict['pool']
        return self_dict

    def __setstate__(self, state):
        self.__dict__.update(state)

if __name__ == '__main__':
    test = Test()
    test.start()

2 个答案:

答案 0 :(得分:1)

我可以重现您的问题,也没有提出<script type="text/javascript" src="$WEBAPIS/webapis/webapis.js"></script> 这应该引发以下错误,不知道为什么不:

  

RuntimeError:只应通过继承在进程之间共享队列对象

用以下代码替换您的代码行:

Traceback

为什么会发生这种情况? m = multiprocessing.Manager() self.queue = m.Queue() 用于一个 multiprocessing.Queue,您正在使用Process,它使用多个multiprocessing.Pool,您必须使用 Process

使用Python测试:3.4.2

答案 1 :(得分:0)

  • 您使用apply_async,它会立即返回。所以你应该在某个地方等待结果

  • 在引擎盖下,python将为子进程挑选要执行的函数。但是self.process作为一种方法在这里是不可能的(因为self.pool属性,请参见下面的ShadowRanger评论)。

import multiprocessing
import time

def subprocess():   # is a plain old (pickle-able) function
    for i in range(10):
        print("Running")
        time.sleep(1)
    print("Subprocess Completed")
    return True

class Test:
    def __init__(self):
        self.pool = multiprocessing.Pool(1)

    def start(self):
        result = self.pool.apply_async(subprocess)
        print("Subprocess has been started")
        result.get()    # wait for the end of subprocess
        self.pool.close()
        self.pool.join()

if __name__ == '__main__':
    test = Test()
    test.start()