该标准 行为的multiprocessing
Windows上是对进口__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
as作为程序运行时才执行,而__main__.py
在导入时不执行。
<flame>
要么切换到使用支持真实fork()-ing的真实操作系统</flame>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句