python - 可以创建不导入 __main__ 模块的 Python 多处理子/工作进程吗?
问题描述
Windows 上的标准 行为是在生成时将模块导入子进程。multiprocessing
__main__
对于有很多导入的大型项目,这会显着减慢子进程的启动速度,更不用说消耗的额外资源了。对于子进程将运行仅使用这些导入的一小部分的自包含任务的情况,这似乎非常低效。
有没有办法明确指定子进程的导入?如果不是多处理库,还有其他选择吗?
虽然我对 Python 3 特别感兴趣,但 Python 2 的答案可能对其他人有用。
编辑
我已经确认Lie Ryan 建议的方法有效,如以下示例所示:
import sys
import types
def imports():
for name, val in globals().items():
if isinstance(val, types.ModuleType):
yield val.__name__
def worker():
print('Worker modules:')
print('\n'.join(imports()))
if __name__ == '__main__':
import multiprocessing
print('Main modules:')
print('\n'.join(imports()))
print()
p = multiprocessing.Process(target=worker)
p.start()
p.join()
输出:
Main modules:
builtins
sys
types
multiprocessing
Worker modules:
sys
types
if __name__ == '__main__'
但是,我认为我不能仅仅为了在代码库中启用一个小功能而向我的团队的其他成员出售顶级脚本。仍然希望有一种方法可以在没有顶级更改的情况下做到这一点。
解决方案
您链接的文档告诉您:
确保新的 Python 解释器可以安全地导入主模块,而不会导致意外的副作用(例如启动新进程)。
...
相反,应该使用以下方法保护程序的“入口点”
if __name__ == '__main__':
:...
您还可以将 import 语句放在 if 块中,然后这些 import 语句只会在您__main__.py
作为程序运行时执行,而不是在__main__.py
导入时执行。
<flame>
要么,要么切换到使用支持真正 fork() 的真正操作系统</flame>
推荐阅读
- angular - Angular Material AutoComplete,自动选择 List 中的 Distinct Item
- python - Pandas NLTK - 标记列中的所有行以进行自然语言处理
- python - 制作一个返回任何索引结果的列表,尽管“列表超出范围错误”
- python - 如何调整此正则表达式以在我的数据框中检测正确的日期格式?
- android - 推送通知不适用于 RN0.62.2
- reactjs - npm create-react-app 命令在 Windows 8 上未成功完成
- kotlin - Kotlin JUnit5 测试类是否应该包含包语句?
- python - 将字符串中的数据分成不同的变量
- python - 我在不同的位置有两个文件,一个文件包含 .jpg,另一个文件包含 .xml。我想比较他们的名字和打印差异
- r - 创建一个支持带引号和不带引号的参数的函数(使用 data.table),然后在 purrr::map (或 lapply)中工作