Python类继承multiprocessing,访问类成员时遇到问题

9 投票
1 回答
8937 浏览
提问于 2025-04-17 03:02

简单来说,假设我有以下内容:

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 个回答

12

当你执行 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

撰写回答