如何在多处理中从start()和run()更新属性

时间:2017-08-31 09:15:38

标签: python multiprocessing

我从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)*

1 个答案:

答案 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。