简而言之,我说有以下内容:
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
有人可以向我解释为什么会这样吗?我不理解的是什么,我该怎么做呢?
感谢。
答案 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
。