是否可以创建不导入__main__模块的Python多处理子进程/工作进程?

回声

标准 行为multiprocessingWindows上是对进口__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__.pyas作为程序运行时才执行,__main__.py在导入时不执行


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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python多处理-捕获信号以重新启动子进程或关闭父进程

如何杀死由多处理模块创建的僵尸进程?

Python多处理模块:具有超时的联接进程

Python多处理进程号

Python多处理-是否可以在各个进程之间引入固定的时间延迟?

使用Python多处理的子进程中创建子进程失败

Python的多处理程序中的硬挂子进程

Python多处理比内核启动更多的进程

为什么在“ __main__”中导入模块不允许多进程使用模块?

如何使用python多处理模块重新启动进程

Python多处理:处理2000个进程

Python多处理:添加到子进程中的队列

Python多处理:如果父进程被杀死,子进程会挂起吗?

带有子进程的Python多处理停止工作

终端不工作/无法启动(创建子进程时出错)

Python多处理和子进程的独立性

自动终止进程和多处理池的子进程

Python多处理程序不嵌套子进程?

具有子进程标志的Python多处理无法运行

Python:您是否可以通过多处理进程设置CPU计数

Python多处理:将简单的工作拆分为多个进程

如何在python中使用多处理在进程内创建进程?

python多处理池与进程?

Python 多处理:进程未启动

如何使用多处理模块杀死进程?

python多处理进程的重复名称

Python 多处理正确完成工作,但进程仍然存在(Linux)

Python多处理,如何为可以取消的进程返回变量

使用多处理进程时Python多次导入