我从multiprocessing.Process创建子类。
对象p.run()可以从long_runtime_proc更新instance.ret_value,但是p.start()不能通过调用并运行long_runtime_proc来更新ret_value。
如何使用p.start()获取ret_value?
*class myProcess (multiprocessing.Process):
def __init__(self, pid, name, ret_value=0):
multiprocessing.Process.__init__(self)
self.id = pid
self.ret_value = ret_value
def run(self):
self.ret_value = long_runtime_proc (self.id)*
答案 0 :(得分:0)
直接调用Process.run()
不启动新进程,即Process.run()
中的代码在调用它的相同进程中执行。这就是为什么self.ret_value
的更改有效的原因。但是,您不应该直接致电Process.run()
。
当您使用Process.start()
启动子流程时,会创建一个新的子流程,然后在此新流程中执行Process.run()
中的代码。当您将long_runtime_proc
的返回值分配给self.ret_value
时,这会发生在子进程中,而不是父进程,因此不会更新父ret_vaule
。
您可能需要做的是使用管道或队列将返回值发送到父进程。有关详细信息,请参阅documentation。以下是使用队列的示例:
import time
import multiprocessing
def long_runtime_proc():
'''Simulate a long running process'''
time.sleep(10)
return 1234
class myProcess(multiprocessing.Process):
def __init__(self, result_queue):
self.result_queue = result_queue
super(myProcess, self).__init__()
def run(self):
self.result_queue.put(long_runtime_proc())
q = multiprocessing.Queue()
p = myProcess(q)
p.start()
ret_value = q.get()
p.join()
使用此代码ret_value
将最终被分配给队列中的值1234。