Python类继承多处理,访问类成员时遇到麻烦


问题内容

简而言之,说我有以下几点:

import multiprocessing

class Worker(multiprocessing.Process):
    def __init__(self):
        multiprocessing.Process.__init__(self)
        print "Init"
        self.value = None

    def run(self):
        print "Running"
        self.value = 1

p = Worker()
p.start()
p.join()
print p.value

我希望输出是:

Init
Running
1

相反,它是

Init
Running
None

有人可以向我解释为什么会这样吗?我不了解什么,应该如何正确执行?

谢谢。


问题答案:

您说的那一刻p.start(),是一个独立的过程从主要过程中分叉出来。复制所有变量值。因此,主进程具有的一个副本p,而分叉进程具有的单独副本p。该Worker修改的派生进程的副本p.value,但主要进程的p.value仍然是None

在流程之间共享对象有很多方法。在这种情况下,也许最简单的方法是使用mp.Value

import multiprocessing as mp

class Worker(mp.Process):
    def __init__(self):
        print "Init"
        mp.Process.__init__(self)
        self.num = mp.Value('d', 0.0)

    def run(self):
        print "Running"
        self.num.value = 1

p = Worker()
p.start()
p.join()
print p.num.value

请注意,的mp.Value默认值为0.0。不能设置为None