Предупреждение `RuntimeWarning: coroutine 'Application.initialize' was never awaited` означает, что вы пытаетесь использовать асинхронную корутину, но не вызываете её с помощью `await`. Асинхронные функции (корутины) должны быть ожидаемы в контексте асинхронного вызова, иначе они не выполнятся.
Ошибка `RuntimeError("Cannot close a running event loop")` возникает, когда вы пытаетесь закрыть цикл событий, который еще выполняется. Это может произойти, если вы находитесь в контексте уже работающего цикла событий и пытаетесь закрыть его, не убедившись, что все корутины завершены.
Чтобы правильно управлять асинхронным контекстом и избежать этих ошибок в коде бота, выполните следующие шаги:
1. Убедитесь, что все асинхронные функции вызываются с помощью `await`.
2. Используйте `asyncio.run()` для запуска основной корутины, что автоматически создает и закрывает цикл событий.
3. Никак не пытайтесь закрыть цикл событий, если вы еще не завершили выполнение всех асинхронных задач.
Пример структурированной инициализации Telegram бота:
```python
import asyncio
from aiogram import Bot, Dispatcher, types
API_TOKEN = 'YOUR_API_TOKEN'
async def main():
# Инициализация бота и диспетчера
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
# Регистрируем хэндлеры здесь
# Запускаем поллинг
try:
await dp.start_polling()
finally:
await bot.close()
if __name__ == '__main__':
# Запуск основной корутины
asyncio.run(main())
```
В этом примере:
- `asyncio.run(main())` создает новый цикл событий и запускает корутину `main()`, в которой происходит инициализация и запуск бота.
- Все асинхронные вызовы корректно ожидаются с помощью `await`.
- Если что-то идет не так и требуется завершение работы бота, используется конструкция `try...finally` для корректного завершения работы бота.
Таким образом, вы избегаете предупреждений о "never awaited" и ошибок, связанных с закрытием работающего цикла событий.