Асинхронный исполнитель не завершает процесс после запуска - PullRequest
0 голосов
/ 27 февраля 2019

Я хотел бы иметь пул процессов в основном асинхронном приложении ввода-вывода, потому что иногда необходимо выполнять задачи, связанные с ЦП, которые не должны останавливать основное приложение.Кроме того, я хочу ограничить количество процессов.

Согласно документации, правильный способ - использовать 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 голосов
/ 27 февраля 2019

Пул процессов будет иметь странное поведение, если вы будете использовать его повторно.Поэтому я предлагаю каждый раз создавать новый пул и оборачивать его в структуру with, как показано в примере .

Если вы настаиваете на повторном использовании пула, ответственность за управление имвремя жизни ложится на ваше плечо.После использования вы можете уничтожить все подпроцессы в пуле:

self.process_pool.shutdown()
...