我知道子进程在派生/产生后将看不到更改,并且Windows进程不会继承不使用共享内存的全局变量。但是我所遇到的情况是,孩子无法看到在fork / spawn之前对共享内存中的全局变量所做的更改。
简单演示:
from multiprocessing import Process, Value
global foo
with foo.get_lock():
foo = Value('i',1)
def printfoo():
global foo
with foo.get_lock():
print(foo.value)
if __name__ == '__main__':
with foo.get_lock():
foo.value = 2
Process(target=printfoo).start()
[在Linux和MacOS上,这显示期望的2。在Windows上,它显示1,即使在调用Process
之前对全局值进行了修改。如何在Windows上的子进程中也看到更改?
这里的问题是您的子进程创建一个new共享值,而不是使用父级创建的共享值。您的父进程需要将Value
显式发送给子进程,例如,作为目标函数的参数:
from multiprocessing import Process, Value
def use_shared_value(val):
val.value = 2
if __name__ == '__main__':
val = Value('i', 1)
p = Process(target=use_shared_value, args=(val,))
p.start()
p.join()
print(val.value)
(不幸的是,我没有安装Windows Python对此进行测试。)