Асинхронная функция из синхронной в Python и discord.py

Рейтинг: 0Ответов: 1Опубликовано: 04.08.2023

В моём дискорд-боте необходимо вызвать асинхронную функцию из синхронной, т.к. функция play voice_client'а принимает только синхронный коллбек. Т.к. сама библиотека Discord.py асинхронная, в ней уже есть свой event loop, поэтому решения использовать функции asyncio.run, asyncio.run_coroutine_threadsafe, loop.run_until_complete у меня применить не получилось. Подскажите, что делать?

UPD. Функция коллбека у меня с рекурсией, вот так:

def player(...):
    ...
    voice_client.play(..., after=player)
    ...

asyncio.get_running_loop() выдаёт ошибку - нет цикла событий в текущем потоке

Ответы

▲ 0

Если у вас вызывается синхронная функция из корунтинной функции-обработчика команды дискорд бота, и в этой синхронной функции вызывается ещё и другая асинхронная функция - то её нужно вызывать через asyncio.gather(*tasks). На вход подаются собранные корунтины.