我使用多处理工人池作为一个更大的应用程序的一部分。因为我用它来处理大量简单的数学问题,所以我有一个什么都不共享的体系结构,在这个体系结构中,工人需要的唯一变量都作为参数传递。因此,我不需要worker子进程来导入任何全局变量、我的__main__
模块,或者因此导入的任何模块。在生成池时,有没有任何方法可以强制执行这种行为并避免性能受到影响?在
我应该注意,我的环境是Win32,它缺少os.fork()
,工作进程是通过使用子进程调用系统可执行文件(例如,启动一个新的Python进程),然后序列化所有全局变量,并通过管道发送这些全局变量。话虽如此,我还是想尽量少做上面的事情,这样我的游泳池就能更快地打开了。在
有什么想法吗?在
看一下^{} 实现,特别是}(特定于win32),全局变量没有得到处理。父进程的
get_preparation_data
和{__main__
的重新导入有点难看,但除了顶层的代码外,它不会运行任何代码;甚至if __name__ == '__main__'
子句也不会。所以只要保留主模块就不会有输入时间的副作用。在您也可以防止主模块在子进程启动时导入任何内容(仅在win32上有用,正如您所注意到的,它不能分叉)。将
main()
及其导入移动到单独的模块中,以便启动脚本只包含:在子进程启动中仍然存在一个隐式
import site
。它的初始化很重要,我不认为分叉机有一个简单的方法来禁用它,但我不认为它是昂贵的。在相关问题 更多 >
编程相关推荐