@Marox
Человек

Как запустить выполнение нескольких Future одновременно?

Пишу бекенд на tornado, есть блокирующая функция

class Recognition:
  _thread_pool = ThreadPoolExecutor(max_workers=cpu_count())
  ...
  @run_on_executor(executor="_thread_pool")
    def blocking_func(self,  n):
        # code
        return result


Эту блокирующую функцию надо вызвать для всех элементов массива, делаю так:

@gen.coroutine
def get_res(self):
  a = [1, 2, 4, 7, 9...] # 13 элементов
  result = yield map(self.blocking_func, a)
  raise gen.Return(activations)


Ну и соответственно вызываю:
r = yield self.get_res()

Выполнение блокирующей функции для одного элемента занимает 0.35 секунд. Но выполнение get_res занимает 4-5 секунд. Пробовал gen.multi(), не помогает.
Возможно, нужен какой-то асинхронный map?
  • Вопрос задан
  • 274 просмотра
Решения вопроса 1
@Marox Автор вопроса
Человек
В общем, дело не во Future, а в GIL. Блокирующая функция была CPU-зависимой, так что ThreadPool не помогал. Проблему решил через multiprocessing.Pool, apply_async и gen.Task.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы