Python 阻止池进程导入_umain和全局

Python 阻止池进程导入_umain和全局,python,multiprocessing,Python,Multiprocessing,我正在使用一个工人的多处理池作为一个更大的应用程序的一部分。因为我使用它来处理大量的简单数学,所以我有一个不共享的体系结构,在这个体系结构中,工作人员需要的唯一变量都作为参数传递。因此,我不需要工作子流程来导入任何全局、我的\uuuuu main\uuuuu模块或它导入的任何模块。在生成池时,有没有办法强制执行这种行为并避免性能受到影响 我应该注意,我的环境是Win32,它缺少os.fork(),工作进程是“使用对sys.executable的子进程调用(即启动一个新的Python进程)生成的,

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

我应该注意,我的环境是Win32,它缺少
os.fork()
,工作进程是“使用对sys.executable的子进程调用(即启动一个新的Python进程)生成的,然后序列化所有全局变量,并通过管道发送。”如所示。也就是说,我希望尽可能少地执行上述操作,以便更快地打开我的池

有什么想法吗?

看看实现,特别是
get\u preparation\u data
prepare
(特定于win32),全局变量没有受到影响。重新导入父进程的
\uuuuu main\uuuu
有点难看,但除了顶层的代码外,它不会运行任何代码;即使是
如果
子句。因此,只需保留主模块,而无导入时间副作用


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

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

在子进程启动中仍然有一个隐式的导入站点。它有重要的初始化功能,我不认为mp.forking有一个简单的方法来禁用它,但我并不认为这会很昂贵。

你说的是对的,把你的主代码放在一个
\uuuuu name\uuuuu=='\uuuuu main\uuuuuu'
子句中,不用说,但必须有一个明确的方法或至少一套最佳实践来缩短子流程的启动时间。@kaloyan我认为你没有太多需要改进的地方减少;但是我已经补充了一件不用说的事情,那就是你也可以用这个条款来保护进口。