防止池进程导入主进程和全局参数

2024-05-16 10:28:25 发布

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

我使用多处理工人池作为一个更大的应用程序的一部分。因为我用它来处理大量简单的数学问题,所以我有一个什么都不共享的体系结构,在这个体系结构中,工人需要的唯一变量都作为参数传递。因此,我不需要worker子进程来导入任何全局变量、我的__main__模块,或者因此导入的任何模块。在生成池时,有没有任何方法可以强制执行这种行为并避免性能受到影响?在

我应该注意,我的环境是Win32,它缺少os.fork(),工作进程是通过使用子进程调用系统可执行文件(例如,启动一个新的Python进程),然后序列化所有全局变量,并通过管道发送这些全局变量。话虽如此,我还是想尽量少做上面的事情,这样我的游泳池就能更快地打开了。在

有什么想法吗?在


Tags: 模块方法应用程序环境进程osmain体系结构
1条回答
网友
1楼 · 发布于 2024-05-16 10:28:25

看一下^{}实现,特别是get_preparation_data和{}(特定于win32),全局变量没有得到处理。父进程的__main__的重新导入有点难看,但除了顶层的代码外,它不会运行任何代码;甚至if __name__ == '__main__'子句也不会。所以只要保留主模块就不会有输入时间的副作用。在


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

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

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

相关问题 更多 >