简而言之,我说有以下内容:
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.