3

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__'但是,我认为我不能仅仅为了在代码库中启用一个小功能而向我的团队的其他成员出售顶级脚本。仍然希望有一种方法可以在没有顶级更改的情况下做到这一点。

4

1 回答 1

1

您链接的文档告诉您:

确保新的 Python 解释器可以安全地导入主模块,而不会导致意外的副作用(例如启动新进程)。

...

相反,应该使用以下方法保护程序的“入口点” if __name__ == '__main__':

...

您还可以将 import 语句放在 if 块中,然后这些 import 语句只会在您__main__.py作为程序运行时执行,而不是在__main__.py导入时执行。


<flame>要么,要么切换到使用支持真正 fork() 的真正操作系统</flame>

于 2019-06-08T06:47:28.857 回答