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

时间:2011-09-25 12:08:01

标签: python multiprocessing

简而言之,我说有以下内容:

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

有人可以向我解释为什么会这样吗?我不理解的是什么,我该怎么做呢?

感谢。

1 个答案:

答案 0 :(得分:10)

当你说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