HartX
@HartX
Студент, красавчик, плохой программист=)

Как вызвать асинхронную функцию из обычной функции?

Сразу оговорюсь что с асинхронностью я столкнулся впервые. У меня есть функции библиотеки telethon (которая работает асинхронно). Главная функция выглядит так:
class Main_telegram():
   async def main(self, url):
      channel = await client.get_entity(url) #берём нужный канал
      users = await dump_all_participants(channel) #берём людей, находящихся на канале
      return users

И мне нужно вызвать функцию main этого класса в другом классе. Вот как я это реализовал:
class Telegram:
    def __init__(self) -> None:
        self.cv_telegram = Main_telegram()

    def working(self, list_url):
       list_cv_in_groups = []
       url_groups = list_url
       for url_group in url_groups:
           list_cv_telegram = self.cv_telegram.main(url_group)
           list_cv_in_groups.append(list_cv_telegram)
            
cv_telegram = Telegram()

Но когда я вызываю функцию main программа не заходит в эту функцию в другом классе, а создаёт объект coroutine object MainTelegram.main . Я почитал документацию по этому объекту, но так и не понял, как с ним работать. Из этого и мой вопрос. Как мне вызвать асинхронную функцию из обычной функции и возможно ли это вообще?
  • Вопрос задан
  • 7029 просмотров
Решения вопроса 1
gscraft
@gscraft
Программист, философ
Вам придется идти асинхронно от корня, любой async сопровождается await (и наоборот):
import asyncio

async def main():
    await ... # вызов библиотек

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(main()) # передайте точку входа
    finally:
        # действия на выходе, если требуются
        pass

Да, стоит разобраться с работой asyncio по документации или публикациям-гайдам.

PS почему Main_telegram а не MainTelegram ? Обратите внимание на https://www.python.org/dev/peps/pep-0008/#class-names , есть смысл следовать подходам в стиле кода.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Либо используйте синхронную библиотеку, либо читайте документацию по asyncio, а то вас ждёт множество сюрпризов.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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