我正在使用工作人员的多处理池作为更大的应用程序的一部分。由于我用它来处理大量的简单数学,所以我有一个无共享的架构,其中工作人员需要的唯一变量作为参数传递。因此,我不需要工作子进程来导入任何全局变量,我的__main__
模块,或者因此,它导入的任何模块。有没有什么方法可以强制这种行为并避免在生成池时影响性能?
需要注意的是,我的环境是Win32,缺少os.fork()
并且产生了工作进程“使用对 sys.executable 的子进程调用(即启动一个新的 Python 进程),然后序列化所有全局变量,并通过管道发送它们。” as per 这个帖子 https://stackoverflow.com/questions/765129/hows-python-multiprocessing-implemented-on-windows。话虽这么说,我想尽可能少地执行上述操作,以便我的池打开得更快。
有任何想法吗?
看着multiprocessing.forking http://hg.python.org/cpython/file/tip/Lib/multiprocessing/forking.py实施,特别是get_preparation_data
and prepare
(特定于 win32),全局变量不会被腌制。父进程的重新导入__main__
有点难看,但是除了顶层代码之外它不会运行任何代码;甚至不if __name__ == '__main__'
条款。因此,只需保留主模块,而不会产生导入时的副作用。
您也可以在子进程启动时阻止主模块导入任何内容(仅在 win32 上有用,正如您所注意到的,它无法分叉)。移动main()
并将其导入到单独的模块中,以便启动脚本仅包含:
if '__name__' == '__main__':
from mainmodule import main
main()
还是有隐含的import site
在子进程启动时。它进行重要的初始化,我不认为 mp.forking 有一个简单的方法来禁用它,但我不认为它会很昂贵。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)