我遇到了多处理问题。代码包含在下面。代码可以按预期执行,但是当取消注释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()
答案 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()