Как запустить функцию одновременно с ботом в библиотеке aiogram?

Как запустить асинхронную функцию вместе с ботом, чтобы обе задачи работали параллельно без взаимного влияния? Пишу бота на библиотеке aiogram версии 2.23.1. Ранее использовал данный метод (ссылка на скриншот), но сейчас при его использовании возникает ошибка: "DeprecationWarning: There is no current event loop". Хотелось бы узнать другие варианты кода для решения этой проблемы. Ссылка на скриншот: [тут ссылка]. Спасибо заранее.
  • 4 марта 2024 г. 19:09
Ответы на вопрос 2
Для запуска асинхронной функции одновременно с ботом в aiogram, необходимо использовать asyncio и создать отдельный event loop для этой функции. 

Пример кода:

```python
import asyncio
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.middlewares.logging import LoggingMiddleware
from aiogram import executor

# Инициализация бота
TOKEN = 'your_token_here'
bot = Bot(token=TOKEN)
dp = Dispatcher(bot)
dp.middleware.setup(LoggingMiddleware())

# Функция, которую нужно запустить одновременно с ботом
async def some_async_function():
    while True:
        print('Async function is running...')
        await asyncio.sleep(5)

# Функция-обработчик команды /start
@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    await message.answer("Bot has started!")

if __name__ == '__main__':
    # Создание и запуск event loop для асинхронной функции
    loop = asyncio.get_event_loop()
    loop.create_task(some_async_function())

    # Запуск бота
    executor.start_polling(dp, loop=loop, skip_updates=True)
```

В данном примере функция `some_async_function` будет запущена параллельно с работой бота. Отдельный event loop для этой функции создается с помощью `asyncio.get_event_loop()` и метода `create_task()`. 

Таким образом, обе задачи будут работать параллельно без взаимного влияния.
Во-первых, переводим слово "warning". Это не ошибка, это предупреждение. 
Во-вторых, погуглить не пробовал?
В ранних версиях asyncio get_event_loop() создавал рабочий цикл asyncio, если он ещё не был создан, и возвращал существующий, если он был. Потом от этого поведения решили отказаться. Пока что оно ещё работает, но потом сломается.
Так что в начале программы используй new_event_loop(), а если нужно получить ссылку на цикл в корутине - get_running_loop()

И я удивлюсь, если окажется, что ошибка именно в этом. У тебя где-то ещё должен быть косяк. Скорее всего одна из запускаемых корутин выполняет длительную операцию синхронно.
Похожие вопросы