异步执行程序在运行后不会终止进程

时间:2019-02-27 12:05:05

标签: python concurrency python-asyncio

我想在一个大多数异步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
        )

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

1 个答案:

答案 0 :(得分:1)

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

如果您坚持要重用池,则管理池寿命的责任就落在了您的肩上。使用后,您可以通过

杀死池中的所有子进程。
self.process_pool.shutdown()