gpt4 book ai didi

python - 为什么 multiprocessing.Process 在 windows 和 linux 上对于全局对象和函数参数的行为不同

转载 作者:太空狗 更新时间:2023-10-29 17:23:37 24 4
gpt4 key购买 nike

以下代码在windows和linux(都是python2.7)上运行时输出不同

'''import_mock.py'''
to_mock = None
'''test.py'''
import import_mock
from multiprocessing import Process

class A(object):
def __init__(self):
self.a = 1
self.b = 2
self.c = 3

def __getstate__(self):
print '__getstate__'
return { 'a': self.a, 'b': self.b,
'c':0 }

def func():
import_mock.to_mock = 1
a = A()
return a

def func1(a):
print a.a, a.b, a.c
print import_mock.to_mock


if __name__ == '__main__':
a = func()
p = Process(target=func1, args=(a,))
p.start()
p.join()

在 Windows 上,输出是:

__getstate__
1 2 0
None

这是我所期望的

在 linux 上,它是:

1 2 3
1

它不克隆全局对象和传递的参数。

我的问题是为什么他们的行为不同?以及如何使 linux 代码的行为与 windows 代码相同?

最佳答案

在 Linux(和其他类 Unix 操作系统)上,Python 的 multiprocessing 模块使用 fork() 创建新的子进程,有效地继承父进程内存的副本状态。这意味着解释器不需要 pickle 作为 Processargs 传递的对象,因为子进程已经以其正常形式提供了这些对象。

Windows 没有 fork() 系统调用,因此 multiprocessing 模块需要做更多的工作才能使子进程产生工作。首先是基于fork() 的实现,然后是非 fork Windows 实现。

值得注意的是,Python 开发人员经常认为,根据您运行 Python 的平台,创建的子进程差异如此之大有点不妥。所以在 Python 3.4 中,添加了一个新系统,让你可以 select the start method that you would prefer to use .选项是 "fork""forkserver""spawn""fork" 方法仍然是类 Unix 系统的默认方法(它是早期 Python 版本中的唯一实现)。 "spawn" 方法是 Windows 上的默认(也是唯一)选项,但现在也可以在类 Unix 系统上使用。 "forkserver" 方法是两者的混合体(并且仅在某些类 Unix 系统上可用)。您可以在文档中阅读有关这些方法之间差异的更多信息。

关于python - 为什么 multiprocessing.Process 在 windows 和 linux 上对于全局对象和函数参数的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38236211/

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