#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())
Пожалуйста, обратите внимание, что в этом примере есть несколько проблем, о которых вам нужно помнить:
- У вас должен быть уже запущенный цикл.
- Функция
run_in_executor
возвращает будущее, а не результаты. - Результаты могут (с высокой вероятностью) быть готовы не сразу.