添加到@Blckknght的答案:在Windows上,每个进程都“从头开始”导入原始模块,而在Unix-
y系统上,只有主进程运行整个模块,而所有其他进程都会看到当时存在的
fork()内容用于创建该模块。新流程(不, 您
不称
fork()自己-
multiprocessing内部人员在创建新流程时会调用它)。
详细为您
import_mock:
在所有平台上,主进程调用
func()
,其设置import_mock.to_mock
为1。在Unix-y平台上,这是所有新进程所看到的:
fork()
之后发生,因此1是所有新进程继承的状态。在Windows上,所有新进程都“从头开始”运行整个模块。因此,他们各自导入自己的全新版本的
import_mock
。只有主进程调用func()
,因此只有主进程看到to_mock
更改为1。所有其他进程看到最新None
状态。
这都是预料之中的,并且第二次实际上很容易理解;-)
传递的过程
a是微妙的,因为它更多地取决于
multiprocessing实现细节。该实现 可能
从一开始就选择在所有平台上腌制参数,但事实并非如此,现在进行更改而又不破坏 某些 平台上的内容为时已晚。
由于写时复制的
fork()语义,因此 不必
Process()在Unix-
y系统上腌制参数,因此实现从来没有。但是,如果没有
fork(),则必须在Windows上对其进行酸洗-实现也是如此。
在允许您
spawn在所有平台上强制执行“ Windows实现”()的Python 3.4之前,没有机械方法来避免可能出现的跨平台意外情况。
但实际上,我很少为此感到困扰。 例如, 知道
多处理可能严重依赖于酸洗,因此我完全不了解使用酸洗技巧。传递
A()实例时出现“问题”的唯一原因是您正在玩腌菜(通过覆盖默认值
__getstate__())。



