Периодические и непериодические задачи с помощью Django + Telegram + Celery
Я создаю проект на основе Django, и одним из моих намерений является бот для Telegram, который получает информацию из группы Telegram. Я смог реализовать бота для отправки сообщений в Telegram без проблем.
На данный момент у меня есть пара Celery задач, которые выполняются с Beat, а также Django web, которые декопированы. Здесь все хорошо.
Я увидел, что python-telegram-bot запускает функцию в одном из примеров (https://github.com/python-telegram-bot/python-telegram-bot/blob/master/examples/echobot.py), которая простаивает в ожидании получения данных от Telegram. Сейчас все мои задачи в Celery в данный момент периодические и вызываются каждые 10 или 60 минут Beat. Как я могу запустить эту непериодическую задачу с помощью Celery в моей конфигурации? Я говорю непериодическая, потому что я понял, что она будет ждать контента, пока ее не прервут вручную.
Django~=3.2.6
celery~=5.1.2
CELERY_BEAT_SCHEDULE = { 'task_1': { 'task': 'apps.envc.tasks.Fetch1', 'schedule': 600.0, }, 'task_2': { 'task': 'apps.envc.tasks.Fetch2', 'schedule': crontab(minute='*/60'), }, 'task_3': { 'task': 'apps.envc.tasks.Analyze', 'schedule': 600, },
}
В моем tasks.py одна из задач выглядит следующим образом:
@celery_app.task(name='apps.envc.tasks.TelegramBot')
def TelegramBot():
status = start_bot()
return status
В качестве реализации start_bot я просто скопировал пример echobot.py и добавил туда свой TOKEN (конечно, функции для различных команд из примера тоже там).
В PTB, Updater.start_polling/webhook()
запускает фоновый поток, который ожидает входящих обновлений. Updater.idle()
блокирует основной поток и при получении сигнала "стоп" завершает упомянутый выше фоновый поток.
Я не знаком с Celery и знаю только основы Django, но я вижу здесь несколько вариантов, на которые я хотел бы обратить внимание.
- Вы можете запустить код, связанный с PTB, в отдельном потоке, т.е. в потоке, который вызывает
Updater.start_polling
иUpdater.idle
. Чтобы завершить этот поток при выключении, вы должны передать сигнал stop этому потоку .
- И наоборот, вы можете запустить PTB в основном потоке, а задачи, связанные с Django & Celeray, в отдельном потоке .
- Вы не должны использовать
Updater
. Поскольку вы все равно используете Django, вы можете перейти на решение на основе webhook для получения обновлений, где Django будет служить webhook для вас. Вы даже можете полностью отказаться от потоков для PTB, вызываяDispatcher.process_update
вручную. Пожалуйста, смотрите эту страницу вики для получения дополнительной информации о пользовательских решениях webhook .
- Наконец, я хотел бы упомянуть, что PTB поставляется со встроенным решением для планирования задач, см. вики-страницу
Job Queue
. Это может быть или не быть актуальным для вас в зависимости от вашей установки.
Dislaimer: В настоящее время я являюсь сопровождающим python-telegram-bot