Child 进程未继承 Windows 上的 Python 全局变量
Child process not inheriting Python global variable on Windows
我知道 child 进程不会看到在 fork/spawn 之后所做的更改,并且 Windows 进程不会继承不使用共享内存的全局变量。但是我遇到的情况是 children 看不到 fork/spawn 之前对共享内存中的全局变量所做的更改。
简单演示:
from multiprocessing import Process, Value
global foo
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 上的 child 进程也能看到更改?
这里的问题是您的子进程创建了一个 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 安装来测试它。)
子进程无法继承 Windows 上的全局变量,无论这些全局变量是否初始化为 multiprocessing.Value
个实例。 multiprocessing.Value
不会改变子进程重新执行文件的事实,并且重新执行 Value
构造不会使用父进程分配的共享资源。
我知道 child 进程不会看到在 fork/spawn 之后所做的更改,并且 Windows 进程不会继承不使用共享内存的全局变量。但是我遇到的情况是 children 看不到 fork/spawn 之前对共享内存中的全局变量所做的更改。
简单演示:
from multiprocessing import Process, Value
global foo
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 上的 child 进程也能看到更改?
这里的问题是您的子进程创建了一个 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 安装来测试它。)
子进程无法继承 Windows 上的全局变量,无论这些全局变量是否初始化为 multiprocessing.Value
个实例。 multiprocessing.Value
不会改变子进程重新执行文件的事实,并且重新执行 Value
构造不会使用父进程分配的共享资源。