Python多处理的不同性能.池在MacOS和Linux系统



我是Python的初学者。我使用了多进程。在我的项目池,以提高性能。

下面是我使用multiprocessing.Pool的代码片段。

我在常驻服务器启动时构建池,并使用池。当服务器每次收到请求时,调用Apply_async方法:

# build pool when server started
mp.set_start_method('forkserver')
self._driver_pool = Pool(processes=10)
self._executor_pool = Pool(processes=30)  
# use pool every time get a request
driver = driver_class(driver_context, init_table, self._manager, **kwargs_dict)
future = self._driver_pool.apply_async(driver.run)

我在我的计算机上测试了代码,我的计算机的操作系统是MacOS,然后我将代码部署在Linux计算机上。

我发现当我在MacOS上运行我的代码时,apply_async方法可能花费10ms,但在Linux上相同的代码将花费2s。

我不明白为什么在性能上有这么大的差异,是我使用multiprocessing.Pool的方式有问题吗?

经过一些测试,我有一个猜想。

当前的现象是当Pool的大小设置为30时,前30个请求很慢,超过30个请求后,任务的性能会明显下降。

在MacOS上,我比较了有和没有pyc文件的两种情况下的性能,我发现删除pyc文件后成本会增加。

我怀疑性能差异可能有以下几个原因:

  1. 当使用'forkserver'方法启动一个进程时,它会加载包括导入文件在内的所有资源,这意味着进程会尝试查找pyc文件,否则它会将python文件编译成pyc文件然后加载。

  2. 池中的进程永远不会释放,这意味着一旦一个进程将pyc文件加载到它的内存中,它将永远不会再次加载。

  3. Mac电脑有SSD硬盘,这意味着如果Mac上的进程试图加载pyc文件,它将比没有SSD硬盘的电脑上的进程获得更好的性能。

现在我遇到的问题是,是否有办法为使用'forkserver'方法启动的进程预加载资源,以获得更好的性能。

最新更新