#python #python-asyncio
#python #python-asyncio
Вопрос:
В настоящее время я использую asyncio для обработки некоторых вызовов API, для получения ответа на которые требуется время. Прямо сейчас поток выполнения выглядит следующим образом:
[[task_1],[task_2]...[task_n]] => [buffer] => [asyncio event_loop]
В настоящее время он настроен так, что в буфер всегда поступают задачи, и этот буфер ожидает завершения выполнения цикла событий run_until_complete
.
Это узкое место, поскольку я хочу, чтобы все задачи постоянно передавались в event_loop, однако, без буфера и run_until_complete
не выполнимо, и если я попытаюсь проигнорировать run_until_complete
, машина в конечном итоге выйдет из строя, предположительно из-за ошибки оом или чего-то еще на этом уровне.
Задачи, над которыми я работаю, зависят от времени, что означает, что чем дольше задачи остаются в буфере, тем хуже, я думал о создании нескольких event_loops, но будет ли это вообще работать? Я чувствую, что неправильно подхожу к этому вопросу.
Tl; dr, есть ли способ использовать что-то похожее на run_until_complete
, но фактически не блокировать поток выполнения, вместо этого просто переводя его в фоновый режим?
Комментарии:
1. Недавно я обнаружил gevent, и его способность создавать задачи и выполнять их кажется альтернативой asyncio, но я не уверен, поможет ли это с этой проблемой.
2. Трудно что-то сказать, не видя примера, но почему бы не использовать очередь в качестве буфера, который не будет узким местом
Ответ №1:
Недавно я выяснил, что с помощью модулей greenlet от gevent я смог решить проблему.
Первоначально самая большая проблема заключалась не в том, что запросы занимали слишком много процессорного времени, а в том, что каждый запрос требовал значительного объема ввода-вывода, отсюда и низкая производительность.
Проблема была решена с помощью gevent для исправления стандартных утилит python:
from gevent import monkey
monkey.patch_all()
Некоторые примечания из документации заключаются в том, что событие исправления должно быть выполнено как можно скорее и пока программа все еще находится в однопоточном состоянии. Также обратите внимание, что в любой момент времени будет выполняться только один зеленый значок, однако, поскольку моя проблема заключалась в том, что операция ввода-вывода останавливала поток при таком подходеустранены проблемы с высокой задержкой.