InternetMaster
@InternetMaster
Интернет

Как в новом потоке запустить асинхронную функцию?

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

from threading import Thread

async def aaa(): # Функция которую нужно запустить в новом потоке
    pass

async def ddd(): # Функция из которой нужно запустить новый поток
    Thread(target=aaa).start()


Но я обламываюсь, так как там возникает Runtime ошибка. Может есть предложения?
  • Вопрос задан
  • 2262 просмотра
Решения вопроса 1
Вот все решения которые пришли в голову от простого и правильного к нетипичному.
  1. Не использовать новые потоки, потому что код и так асинхронный
  2. Сделать функцию aaa синхронной - проблема с запуском нового потока уйдет
  3. Если aaa невозможно изменить - нужно сделать обертку в виде синхронной функции (или декоратора), в который создать новый eventloop (предположим используется asyncio)

def wrapper(*args, **kwargs):
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    loop.run_until_complete(aaa(*args, **kwargs))
    loop.close()
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Есть не предположение, а уверенность, что смешивать многопоточность с асинхронностью - плохая идея и не нужно почти никогда.
Ответ написан
@freeam
Так делать НЕПРАВИИЛЬНО! Сам интепретатор Вам об этом говорит. Это несовместимые вещи.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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