我想在一个大多数异步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
)
您如何重用进程池中的进程或终止进程以遵守上限?
答案 0 :(得分:1)
如果重新使用进程池,它将具有奇怪的行为。因此,我建议每次创建一个新的池,并将其包装为Example所示的with
结构。
如果您坚持要重用池,则管理池寿命的责任就落在了您的肩上。使用后,您可以通过
杀死池中的所有子进程。self.process_pool.shutdown()