使用 Flask 动态调度 Celery Beat 任务

Posted

技术标签:

【中文标题】使用 Flask 动态调度 Celery Beat 任务【英文标题】:Dynamically Schedule Celery Beat task with Flask 【发布时间】:2015-09-07 07:20:59 【问题描述】:

我希望能够让我的应用程序用户使用 Celery beat 启动/停止定期 crontab 样式的任务。现在我用

运行 Celery
venv/bin/celery worker -A celery_worker.celery --loglevel=info

我用这个简单的例子运行了 Celery Beat:

@celery.task
def add(x, y):
    return x + y

在我的配置文件上:

CELERYBEAT_SCHEDULE = 
    'add-every-30-seconds': 
        'task': 'app.email.add',
        'schedule': timedelta(seconds=30),
        'args': (16, 16)
    ,

CELERY_TIMEZONE = 'UTC'

然后我运行 Celery beat worker

celery -A celery_worker.celery beat -s ~/Documents/cesco-automation/power/celerybeat-schedule

而且效果很好!但我需要对日程安排有更多的控制权。

在我的应用程序外壳上,我也能够做到这一点。

>>>add.apply_async([80,800],countdown=30)

>>> from datetime import datetime, timedelta     
>>> tomorrow = datetime.now() + timedelta(days=1)
>>> add.apply_async(args=[10, 10], eta=tomorrow)

这很好,但我正在开发一个家庭自动化应用程序,所以我还需要停止这些任务。我该怎么做??

我还发现这个link 提到了一个 django 自定义调度程序类。这正是我需要的。在Celery docs 上,它提到了 -S 标志,但我不知道如何正确地将类添加到我的 Flask 应用程序中。如何将它与 Flask 一起使用??

我真的需要 Celery Beat 吗?除了 crontab 还有其他选择吗? crontab 似乎不够清晰。

【问题讨论】:

默认的 celery 调度程序有点糟糕。甚至不要让我开始用它来处理时区。我会使用数据库调度程序,可以查看 django celery.readthedocs.org/en/latest/userguide/… 我在这个问题上提到了同一个文档,但不知道如何使它工作。我可以在我的 Flask 应用程序上使用 Django 调度程序吗?怎么样? @CESCO,嗨,你试过在烧瓶应用程序中使用 django 调度程序吗?如果是,请分享 @SaadAbdullah 抱歉,这里没有成功 好吧,我找到了一些东西......而且它工作正常......如果有人需要github.com/tuomur/celery_sqlalchemy_scheduler 【参考方案1】:

此功能将在 Celery ver.4.0 中提供。 目前仅开发版支持动态任务调度:http://docs.celeryproject.org/en/master/userguide/periodic-tasks.html#beat-entries

【讨论】:

看起来 Celery 4.0.0 已于 2016-11-04 发布(稳定版):docs.celeryproject.org/en/latest/changelog.html#version-4-0-0。这意味着动态 crontab 定期计划可用。 你有任何使用动态 crontab 的例子吗? 仅在节拍开始之前有效。在节拍重新开始之前,不会拾取添加到日程表中的任何内容。仍然没有办法动态添加周期性任务。 @Dineshs91,我觉得这条评论和 +2 令人困惑。我也在寻找动态 celery,并且有这个 post comment from a year earlier 关于 Celery peeps 的包,django-celery-beat 建议可以通过数据库更改重新加载计划。我想知道你具体指的是什么。【参考方案2】:

即使我们为我们的应用放弃了烧瓶/python。通过使用名为Kala 的调度程序解决了这个问题。这是一个由Chronus 启发的基于 HTTP API 的简单 JSON,其功能与 Kala 相同,但 Airbnb 提供了更强大和可扩展的解决方案。它完全与语言无关。

【讨论】:

以上是关于使用 Flask 动态调度 Celery Beat 任务的主要内容,如果未能解决你的问题,请参考以下文章

flask使用celery

Celery Beat 调度程序不会在 Django 中执行我的任务

检查 celery beat 是不是启动并运行

基础入门_Python-模块和包.深入Celery之Beat触发定时/周期性任务?

celery简介

Celery 使用