Как контролировать python concurrent.futures.ProcessPoolExecutor?

Мы используем ProcessPoolExecutor из concurrent.futures в службе, которая асинхронно принимает запросы и выполняет фактическую синхронную обработку в пул процессов.

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

Есть ли способ опросить пул процессов для его текущего использования? Это позволило бы нам следить за их состоянием и планировать необходимые мощности.

Если этого не происходит, есть ли хорошая альтернатива пула альтернативных процессов с асинхронным интерфейсом, который поддерживает такое планирование мониторинга/емкости?

Ответ 1

Самый простой способ - расширить ProcessPoolExecutor с желаемым поведением. Пример ниже поддерживает интерфейс stdlib и не имеет доступа к деталям реализации:

from concurrent.futures import ProcessPoolExecutor


class MyProcessPoolExecutor(ProcessPoolExecutor):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._running_workers = 0

    def submit(self, *args, **kwargs):
        future = super().submit(*args, **kwargs)
        self._running_workers += 1
        future.add_done_callback(self._worker_is_done)
        return future

    def _worker_is_done(self, future):
        self._running_workers -= 1

    def get_pool_usage(self):
        return self._running_workers