防止池进程导入 __main__ 和全局变量

2024-05-01

我正在使用工作人员的多处理池作为更大的应用程序的一部分。由于我用它来处理大量的简单数学,所以我有一个无共享的架构,其中工作人员需要的唯一变量作为参数传递。因此,我不需要工作子进程来导入任何全局变量,我的__main__模块,或者因此,它导入的任何模块。有没有什么方法可以强制这种行为并避免在生成池时影响性能?

需要注意的是,我的环境是Win32,缺少os.fork()并且产生了工作进程“使用对 sys.executable 的子进程调用(即启动一个新的 Python 进程),然后序列化所有全局变量,并通过管道发送它们。” as per 这个帖子 https://stackoverflow.com/questions/765129/hows-python-multiprocessing-implemented-on-windows。话虽这么说,我想尽可能少地执行上述操作,以便我的池打开得更快。

有任何想法吗?


看着multiprocessing.forking http://hg.python.org/cpython/file/tip/Lib/multiprocessing/forking.py实施,特别是get_preparation_data and prepare(特定于 win32),全局变量不会被腌制。父进程的重新导入__main__有点难看,但是除了顶层代码之外它不会运行任何代码;甚至不if __name__ == '__main__'条款。因此,只需保留主模块,而不会产生导入时的副作用。


您也可以在子进程启动时阻止主模块导入任何内容(仅在 win32 上有用,正如您所注意到的,它无法分叉)。移动main()并将其导入到单独的模块中,以便启动脚本仅包含:

if '__name__' == '__main__':
    from mainmodule import main
    main()

还是有隐含的import site在子进程启动时。它进行重要的初始化,我不认为 mp.forking 有一个简单的方法来禁用它,但我不认为它会很昂贵。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止池进程导入 __main__ 和全局变量 的相关文章

随机推荐

  • 如何使用openJDK11运行Eclipse?

    怎样必须eclipse ini看起来像是让 Eclipse Photon 2018 09 或 2018 12 在 openJDK11 上运行 我已经安装了 openJDK 11 0 1 和 Eclipse 2018 09 我有一个包含 XM
  • Java Swing并发显示JTextArea

    我需要执行 显示从 Arraylist 到 JTextArea 的一系列事件 但是 每个事件的执行时间不同 以下是我的目标的一个简单示例 public void start ActionEvent e SwingUtilities invo
  • 读/写结构到文件 - c

    我正在用 C 语言创建一个学生数据库 我需要做的最后一件事是能够读取我创建的数据库并将其写入文件 所以我已经有了一个充满指向学生结构的指针的数组 我需要将其写入文件 一旦我写完它 我也需要能够将它读回到我的数组中 我真的不知道该怎么做 这是
  • Google Colab:为什么 CPU 比 TPU 快?

    我正在使用 Google colabTPU训练一个简单的Keras模型 删除分布式strategy并在CPU比TPU 这怎么可能 import timeit import os import tensorflow as tf from sk
  • 我什么时候应该声明一个不带 noexcept 的移动构造函数?

    该标准不会在移动构造函数上强制执行 noexcept 在什么情况下移动构造函数可以抛出异常 当你真的别无选择的时候 大多数时候你的移动构造函数应该是noexcept 它们是默认的 看这个 http www codingstandard co
  • 更改 UITextField 占位符颜色

    如何动态更改占位符颜色UITextField 这始终是相同的系统颜色 xib 编辑器中没有选项 来自文档 property 非原子 复制 NSAttributedString attributedPlaceholder 该属性默认为零 如果
  • 为什么 SwiftMailer 发送两封电子邮件?

    我通过 PHP 的 SwiftMailer 库发送电子邮件 我有这个 PHP 代码 用于从 1 个发件人向 1 个电子邮件收件人发送 1 封电子邮件 这是代码 email some email recipient sendEmail sen
  • 你能限制 TypeScript 全局类型的范围吗?

    我们的团队已经配置了 TypeScript 来使jest全球可用的类型 tsconfig json types jest testing library jest dom 这真的很好 test ts文件 但今天我意识到它也接受jest 和相
  • Python ggplot 和 ggplotly

    前 R 用户 我曾经通过 ggplotly 函数广泛组合 ggplot 和plot ly 库来显示数据 刚接触 Python 时 我看到 ggplot 库可用 但找不到与用于图形反应显示的绘图简单组合的任何内容 我想要寻找的是这样的 fro
  • Postgresql:如何从时间戳、时区字段正确创建带有时区的时间戳

    我有一个带有时间戳但没有时区的表 年 月 日 时 分 秒 以及 时区 字段 P 代表太平洋 M 代表山地 我需要创建一个 带有时区的时间戳 类型的字段 鉴于我有两个字段 有没有办法正确考虑夏令时 具体来说 时间戳 2013 11 03 01
  • 适用于 Android 的 Google Analytics API v4 不发送屏幕视图

    我已经为 google Analytics api v4 设置了所有内容 如下所示 https developers google com analytics devguides collection android v4 https de
  • 将数组大小定义为用户输入的变量合法吗?

    我认为数组的大小应该是恒定的 我在 VS 2019 中编写代码 甚至当我执行以下操作时 const int size 5 int number size 我会收到这个错误expression must have a constant val
  • 如何将父小部件焦点重定向到子小部件?

    有一个简单的类叫做FloatingPointPropertyEditor 它继承的是QWidget并包含一个QLineEdit带有浮点数验证器的实例 class FloatingPointPropertyEditor public QWid
  • move_uploaded_file() 无法打开流

    我正在尝试通过 POST 通过 Pycurl 上传文件 在接收端使用 PHP 脚本 由于某种原因 PHP 部分似乎会导致错误 我将其精简为两个简短的测试脚本 import pycurl UPLOADURL http 127 0 0 1 ne
  • ASP.NET CLR 未启用

    当我运行我的应用程序时 在新安装的 ASP Net 和 SQL Server 上出现以下错误 Execution of user code in the NET Framework is disabled Enable clr enable
  • 无法从Windows 10 cmd运行python程序

    这是我电脑上安装python的路径A software installation python并且在环境变量中的系统路径中添加了相同的路径 我的脚本存储在A python programs但是当我尝试从 Windows 命令提示符 cmd
  • Windows/C++:是否可以找到抛出具有“异常偏移”的异常的代码行

    我们的一位用户在我们的产品启动时遇到异常 她从 Windows 向我们发送了以下错误消息 Problem Event Name APPCRASH Application Name program exe Application Versio
  • 在一组行中悬停突出显示效果

    我有一张相当大的桌子 由data属性看起来像这样 table tr td td tr tr td td tr tr td td tr tr td td tr tr td td tr tr td td tr table 我事先并不知道可能的组
  • 使用 Jack 时未生成 Dagger 2 组件

    当我启用杰克编译器 https source android com source jack html在Android Studio 2 2中Dagger 2 https google github io dagger 组件未生成 Dagg
  • 防止池进程导入 __main__ 和全局变量

    我正在使用工作人员的多处理池作为更大的应用程序的一部分 由于我用它来处理大量的简单数学 所以我有一个无共享的架构 其中工作人员需要的唯一变量作为参数传递 因此 我不需要工作子进程来导入任何全局变量 我的 main 模块 或者因此 它导入的任