我是 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 方法可能需要 10 毫秒,但在 Linux 上运行相同的代码将花费 2 秒。
我不明白为什么性能有这么大的差异,我使用 multiprocessing.Pool 的方式有问题吗?
经过一些测试,我有一个猜测。
目前的现象是当Pool的大小设置为30时,前30个请求很慢,但是之后任务的性能会明显下降。
在MacOS上,我比较了有和没有pyc文件两种情况下的性能,我发现删除pyc文件后成本会增加。
我怀疑造成性能差异的可能原因有以下几个:
-
当使用“forkserver”方法启动一个进程时,它将加载包括导入文件在内的所有资源,这意味着该进程将尝试查找pyc文件,否则它将把python文件编译为pyc文件然后加载它们。
-
Pool 中的进程永远不会释放,这意味着一旦进程将 pyc 文件加载到其内存中,它将永远不会再次加载。
-
Mac电脑有SSD硬盘,这意味着如果Mac上的进程尝试加载pyc文件,它会比没有SSD硬盘的电脑上的进程获得更好的性能。
现在我遇到的问题是是否有办法为以“forkserver”方法启动的进程预加载资源以获得更好的性能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)