Я не могу дождаться функции func() от __init__

#python #python-asyncio

#python #python-asyncio

Вопрос:

bot.py:

 import asyncio
import async_bot_api
from util import User

bot = new_bot()
user = User()

async def get_username(id):
    return await bot.get_username()

#bot logic

loop = asyncio.get_event_loop()
loop.create_task(bot.run())
loop.run_forever()
  

util.py:

 class User:
    def __init__(self,id):
        self.id = id
        self.username = await get_username()

from bot import get_username()
  

Этот код не работает, я не знаю, как я могу сделать это правильно.
Метод get_username() немного сложнее, чем в этом примере.

Комментарии:

1. Вы не можете ожидать чего-либо в, __init__ потому что __init__ это принципиально не асинхронно. Но даже если бы вы могли, ваш код не работал бы, потому что вы не ожидаете создания User() , и вы не можете дождаться его, потому что вы вызываете конструктор на верхнем уровне.

Ответ №1:

Вы можете попробовать использовать один из следующих примеров:


Создайте цикл и запустите async функцию, используя run_until_complete:

 class User:
    def __init__(self,id):
        self.id = id
        _loop = asyncio.get_event_loop()
        self.username = _loop.run_until_completed(get_username())
  

Пожалуйста, обратите внимание, это может выполняться только в том случае, если цикл еще не запущен.


Запустите async функцию в исполнителе (run_in_executor)

 class User:
    def __init__(self,id):
        self.id = id
        _loop = asyncio.get_event_loop()
        self.username = _loop.run_in_executor(get_username())
  

Пожалуйста, обратите внимание, что в этом примере есть несколько проблем, о которых вам нужно помнить:

  1. У вас должен быть уже запущенный цикл.
  2. Функция run_in_executor возвращает будущее, а не результаты.
  3. Результаты могут (с высокой вероятностью) быть готовы не сразу.