首页 > 解决方案 > 异步执行器在运行后不会终止进程

问题描述

我想在一个主要是异步 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
        )

您如何重用进程池中的进程或终止它们以遵守上限?

标签: pythonconcurrencypython-asyncio

解决方案


如果你重用它,进程池会有奇怪的行为。因此,我建议每次都创建一个新池并将其包装在示例with中所示的结构中。

如果您坚持重复使用池,那么管理其生命周期的责任就落在了您的肩上。使用后,可以通过以下方式杀死池中的所有子进程

self.process_pool.shutdown()

推荐阅读