【发布时间】:2019-02-27 12:05:05
【问题描述】:
我希望在主要是异步 I/O 应用程序中拥有一个进程池,因为有时需要执行 CPU 密集型任务,而这些任务不应该让主应用程序停顿。此外,我想限制进程数。
根据文档,正确的方法是使用run_in_executor。下面的代码可以工作,但它不会在工作完成后终止进程。
import asyncio
from concurrent.futures.process import ProcessPoolExecutor
class App:
def __init__(self):
self.process_pool = ProcessPoolExecutor(4)
self.loop = asyncio.get_event_loop()
async def get_regular(self):
return await regular()
async def get_expensive(self):
return await self.loop.run_in_executor(
self.process_pool, expensive
)
如何重用进程池中的进程或终止它们以遵守上限?
【问题讨论】:
-
尝试过example 中的
map()方法吗? -
这不会在每次调用
get_expensive时创建一个新的进程池(有n 个进程)吗?此外,我只有单元素任务。 -
进程 pool 的意义在于让进程为以后需要时做好准备。这个想法是您只需支付一次流程启动费用,然后从现有流程中获得即时响应。
标签: python concurrency python-asyncio