При использовании веб-фреймворка, который не поддерживает запись параллельного кода с использованием синтаксиса async/await, вы хотите использовать concurrent для ускорения соединения с другой службой, например, подключение Redis, выполнение большого количества запросов и т. д. Итак, вот почему нам нужно запускать цикл событий asyncio в другом потоке.
Создание потока, который запускает цикл событий asyncio навсегда
Поскольку функция asyncio.run_coroutine_threadsafe возвращает объект concurrent.futures.Future, мы просто выполняем метод result, чтобы получить результат сопрограммы. Он будет ждать завершения сопрограммы.
Ниже приведен простой пример, демонстрирующий как его использовать.
Внимание, не запускайте одну и ту же сопрограмму в двух разных циклах событий.
Совместное использование объектов между сопрограммами
Вы должны унаследовать AsyncioEventLoopThread или просто изменить его, чтобы хранить объекты, которые необходимо совместно использовать между сопрограммами.
Используя contextvars для совместного использования объектов между сопрограммами, общие значения должны быть сохранены в contextvars.Context перед запуском сопрограмм.