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

  • 25 августа 2023 г. 12:27
Ответы на вопрос 2
Для задержки выполнения функции в библиотеке aiogram можно использовать асинхронные возможности Python. В основе aiogram лежит асинхронная библиотека asyncio, которая позволяет выполнить асинхронные операции и управлять задержками.

Для задержки выполнения функции можно использовать функцию asyncio.sleep(). Она приостанавливает выполнение программы на указанное количество секунд. Вот пример:

```python
import asyncio

# Асинхронная функция
async def delayed_function():
    print("Начало выполнения")
    await asyncio.sleep(5)  # Задержка в 5 секунд
    print("Завершение выполнения")

# Запуск асинхронной функции
asyncio.run(delayed_function())
```

Теперь касательно рассылки постов/опросов в проекте Django + aiogram. В таком проекте обычно используются Cron-задачи, которые позволяют выполнять определенный код через равные промежутки времени. 

Для реализации рассылки постов/опросов можно создать отдельную асинхронную функцию и вызывать ее по расписанию из Cron-задачи. Внутри этой функции можно использовать aiogram для отправки сообщений в Telegram.

Вот пример кода, как это может выглядеть:

```python
import asyncio
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher

# Инициализация бота
bot = Bot(token="YOUR_TOKEN")
dp = Dispatcher(bot)

# Асинхронная функция рассылки
async def broadcast_post():
    # Получение списка пользователей/групп, которым нужно отправить пост/опрос
    users = get_users_to_send()

    # Отправка сообщения каждому пользователю
    for user in users:
        await bot.send_message(user.id, "Ваш пост/опрос")

# Запуск асинхронной функции по расписанию (например, каждые 30 минут)
async def run_broadcast():
    while True:
        await broadcast_post()
        await asyncio.sleep(30 * 60)  # Задержка в 30 минут

# Запуск асинхронного цикла событий
async def main():
    await dp.start_polling()
    asyncio.create_task(run_broadcast())  # Запуск рассылки

asyncio.run(main())
```

Не забудьте заменить "YOUR_TOKEN" на ваш токен бота и реализовать функцию get_users_to_send(), которая будет возвращать список пользователей/групп, которым нужно отправить пост/опрос.

Такой код позволит вам реализовать рассылку постов/опросов в проекте Django + aiogram бот с задержкой между отправкой каждого сообщения.
Можно использовать`asyncio.sleep()` для задержки времени. А затем создать задачу с помощью`asyncio.create_task(do_mailing(message))`. Она будет выполняться в фоновом режиме, периодически проверяя запланированные рассылки, и выполнять те, которые уже должны быть отправлены. После этого задача будет спать некоторое время до следующей проверки. Эта задача должна быть запущена параллельно с ботом. Этот способ может привести к небольшой погрешности в точном времени рассылки (например, если проверять каждый час - точность будет только до часа). Однако он намного безопаснее. Если во время выполнения`await asyncio.sleep()`, бот упадет и будет перезапущен, он просто не "вспомнит" о невыполненных запланированных рассылках.
Похожие вопросы