Обработка потоковых данных с помощью asyncio

#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()
 

Некоторые примечания из документации заключаются в том, что событие исправления должно быть выполнено как можно скорее и пока программа все еще находится в однопоточном состоянии. Также обратите внимание, что в любой момент времени будет выполняться только один зеленый значок, однако, поскольку моя проблема заключалась в том, что операция ввода-вывода останавливала поток при таком подходеустранены проблемы с высокой задержкой.