栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么multiprocessing.Process在Windows和Linux上对于全局对象和函数参数的行为有所不同

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么multiprocessing.Process在Windows和Linux上对于全局对象和函数参数的行为有所不同

添加到@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__()
)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/624272.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号