防止池进程导入__main__和globals

时间:2011-05-10 23:47:01

标签: python multiprocessing

我正在使用多处理工作池作为更大应用程序的一部分。因为我使用它来处理大量简单的数学运算,所以我有一个无共享的架构,其中工作者所需的唯一变量作为参数传递。因此,我不需要worker子进程来导入任何全局变量,我的__main__模块,或者因此导入它导入的任何模块。是否有任何方法可以强制执行此类行为并避免在生成池时出现性能损失?

我应该注意我的环境是Win32,它缺少os.fork(),并且使用对sys.executable的子进程调用(即启动一个新的Python进程)生成工作进程“,然后序列化所有全局,并通过管道发送它们。“按照this SO post。话虽这么说,我想尽可能少做以上,所以我的游泳池打开得更快。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

查看multiprocessing.forking实现,特别是get_preparation_dataprepare(特定于win32),全局变量不会被腌制。父流程__main__的重新导入有点难看,但除了顶层的代码外,它不会运行任何代码。甚至不是if __name__ == '__main__'条款。所以只需保持主模块没有导入时间的副作用。


您也可以阻止主模块在子进程启动时导入任何内容(仅在win32上有用,正如您所说,它不能分叉)。将main()及其导入移动到单独的模块,以便启动脚本仅包含:

if '__name__' == '__main__':
    from mainmodule import main
    main()

子进程启动中仍然存在隐式import site。它确实重要的初始化,我不认为mp.forking有一个简单的方法来禁用它,但我不认为它是昂贵的。