我是Python的初学者。我在我的项目中使用了multiprocessing.Pool来提高性能。
下面是我使用multiprocessing.Pool的代码片段。
我在驻留服务器的启动时构建池,每次服务器收到请求时使用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上运行代码时,Pool.apply_async方法可能花费10ms,但在Linux上运行相同的代码将花费2s。
我不明白为什么在性能上会有这么大的差异,是我使用多处理池的方式有什么问题吗?
1条答案
按热度按时间rta7y2nd1#
经过一些测试,我有一个猜想。
当前的现象是当Pool的大小设置为30时,前30个请求很慢,但之后,任务的性能会明显下降。
在MacOS上,我比较了有和没有pyc文件的两种情况下的性能,我发现删除pyc文件后成本会增加。
我怀疑性能差异有几个可能的原因:
1.当使用'forkserver'方法启动一个进程时,它会加载包括导入文件在内的所有资源,这意味着进程会尝试找到pyc文件,否则它会将python文件编译成pyc文件,然后加载它们。
1.池中的进程永远不会释放,这意味着一旦进程将pyc文件加载到其内存中,它将永远不会再次加载。
现在我遇到的问题是,是否有方法为使用'forkserver'方法启动的进程预加载资源,以获得更好的性能。