gpt4 book ai didi

python - Linux 和 Windows 之间的多处理输出不同 - 为什么?

转载 作者:IT王子 更新时间:2023-10-29 00:07:36 24 4
gpt4 key购买 nike

我正在尝试将共享 secret 传递给子进程。这在 Linux 环境中有效。在 Windows 环境中, child 不会收到共享 secret 。下面的三个文件是我正在尝试做的一个简单示例:

主.py

import multiprocessing
import module1
import module2

if __name__ == "__main__":
module1.init()
process = multiprocessing.Process(target=module2.start)
process.start()
process.join()

模块1.py

import ctypes
import multiprocessing

x = None

def init():
global x
x = multiprocessing.Value(ctypes.c_wchar_p, "asdf")

模块2.py

import module1

def start():
print(module1.x.value)

在 Ubuntu 14.04 环境中,在 Python 3.5 上,我收到以下输出:

$ python3 main.py
asdf

在 CentOS 7 环境中,我收到以下输出:

$ python3 main.py
asdf

在 Windows 10 上使用适用于 Linux 的 Windows 子系统(在 Creator 更新之前和之后,因此是 Ubuntu 14.04 和 16.04)我得到以下输出:

$ python3 main.py
asdf

但是,在 Windows 7 和 Windows 10 环境中,使用 3.5 或 3.6,我得到一个 AttributeError 而不是上面的输出:

Process Process-1:
Traceback (most recent call last):
File "C:\Python\Python35\lib\multiprocessing\process.py", line 249, in _bootstrap
self.run()
File "C:\Python\Python35\lib\multiprocessing\process.py", line 93, in run
self._target(*self._args, **self._kwargs)
File "H:\Development\replicate-bug\module2.py", line 5, in start
print(module1.x.value)
AttributeError: 'NoneType' object has no attribute 'value'

我正在使用 shared ctype .该值应由子进程继承。

为什么我在 Windows 环境中收到此 AttributeError,但在 Linux 环境中却没有?

最佳答案

正如其中一篇帖子所述automatically linked on the sidebar , Windows 在 *NIX 系统上没有 fork 系统调用。

这意味着 Windows 子进程基本上是完全独立的,而不是共享全局状态(就像 NIX 进程可以做的那样)。这包括模块。

怀疑发生的事情是模块被重新加载,而您在 module2.start 中访问的 module1 并不完全是您期望的模块。

multiprocessing guidelines明确提及模块级常量不受规则约束:“变量可能不包含您期望的内容”。在任何一种情况下,解决方案都是像这样显式地将您想要的模块传递给子进程:

模块2

def start(mod1):
print(mod1.x.value)

主.py

if __name__ == '__main__':
module1.init()
process = multiprocessing.Process(target=module2.start, args=(module1,))
process.start()
process.join()

关于python - Linux 和 Windows 之间的多处理输出不同 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43713806/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com