【发布时间】:2019-10-23 12:43:54
【问题描述】:
Windows 上multiprocessing 的standard behavior 是在生成时将__main__ 模块导入子进程。
对于有很多导入的大型项目,这会显着减慢子进程的启动速度,更不用说消耗的额外资源了。对于子进程将运行仅使用一小部分导入的自包含任务的情况,这似乎非常低效。
有没有办法明确指定子进程的导入?如果不是多处理库,是否有替代方案?
虽然我对 Python 3 特别感兴趣,但 Python 2 的答案可能对其他人有用。
编辑
我已确认approach suggested by 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 python-3.x windows multiprocessing