多处理机炸弹

2024-05-18 09:09:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我在处理Doug Hellmann教程中的以下示例:

import multiprocessing

def worker():
    """worker function"""
    print 'Worker'
    return

if __name__ == '__main__':
    jobs = []
    for i in range(5):
        p = multiprocessing.Process(target=worker)
        jobs.append(p)
        p.start()

当我试图在if语句之外运行它时:

^{pr2}$

它开始不停地产生进程,而停止它的唯一方法就是重新启动!在

为什么会这样?为什么没有生成5个进程并退出?为什么我需要if语句?在


Tags: import示例if进程defjobsfunction教程
3条回答

在Windows上没有fork()例程,因此multiprocessing导入当前模块以访问worker函数。如果没有if语句,子进程将启动自己的子进程,依此类推。在

我不知道multiprocessing,但我怀疑它会产生具有不同的__name__全局的子进程。通过移除测试,您将使每个子级重新启动生成过程。在

注意,文档中提到在windows上需要if语句(here)。在

然而,文档中并没有说这会立即杀死您的机器,需要重新启动。因此,这可能会非常混乱,特别是如果multiprocessing的使用发生在代码内部的某个函数中。不管它隐藏得有多深,您仍然需要在主程序文件中执行if检查。这几乎排除了在任何类型的库中使用multiprocessing。在

multiprocessing总的来说似乎有点粗糙。它可能有线程接口的接口,但没有简单的方法绕过GIL。在

对于更复杂的并行化问题,我还将查看subprocess模块或其他一些库(如mpi4pyParallel Python)。在

相关问题 更多 >