Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
子进程未在Windows上继承Python全局变量_Python_Windows_Global_Python Multiprocessing - Fatal编程技术网

子进程未在Windows上继承Python全局变量

子进程未在Windows上继承Python全局变量,python,windows,global,python-multiprocessing,Python,Windows,Global,Python Multiprocessing,我知道子进程不会看到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.val

我知道子进程不会看到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,即使在调用
进程
之前对全局值进行了修改。如何使更改对Windows上的子进程也可见?

这里的问题是子进程创建了一个新的共享值,而不是使用父进程创建的共享值。父进程需要显式地将
发送给子进程,例如,作为目标函数的参数:

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来测试这一点。)



无论全局进程是否初始化为
multiprocessing.Value
实例,子进程都无法在Windows上继承全局进程<代码>多处理.Value不会改变这样一个事实,即子级重新执行您的文件,并且重新执行
Value
构造不会使用父级分配的共享资源。

@brokenfoot:这不是一个很好的链接。提问者知道,多处理在Windows和Linux上的行为不同,他们明确使用了可用于在进程之间共享数据的机制。他们只是用错了机制。如果我用错了机制,@user2357112supportsMonica,你能告诉我如何正确使用它们吗?我尝试通过调用其
get\u lock
方法来包装值访问,但这并没有改变结果。您的新编辑导致了一个完全不同的问题-您试图获得一个尚不存在的对象的锁。这会在你创建工作进程之前抛出一个NameError。是的,我知道我可以将值作为参数传递给孩子们,但我希望避免这样,因为这是一个破坏性的内部API更改。不过,看起来我无法避免。即使我使用了一个共享值,我仍然需要一个单独的锁,并将其作为一个新的参数传递,所以无论哪种方式都是相同的更改。此外,孩子从不为父母的利益修改价值,因此它根本不必是一个价值;这就是为什么它最初只是一个常规的全局变量,子变量在POSIX操作系统上继承,而不是在Windows上继承。