【发布时间】:2020-06-12 02:59:21
【问题描述】:
我知道子进程在 fork/spawn 之后不会看到所做的更改,并且 Windows 进程不会继承不使用共享内存的全局变量。但是我遇到的情况是,孩子们看不到在 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 上的子进程可见?
【问题讨论】:
-
@brokenfoot:这不是一个很好的链接。提问者知道多处理在 Windows 和 Linux 上的行为不同,并且他们明确使用了可用于在进程之间共享数据的机制。他们只是使用了错误的机制。
-
如果我使用了错误的机制,@user2357112supportsMonica,你能告诉我如何正确使用它们吗?我尝试通过调用其
get_lock方法来包装 Value 访问,但这并没有改变结果。 -
您的新编辑导致了一个完全不同的问题——您正试图获得一个尚不存在的对象的锁定。这只会在你创建工作进程之前抛出一个 NameError。
标签: python windows global python-multiprocessing