使用Flask动态安排Celery Beat任务

时间:2015-06-21 22:08:34

标签: django python-2.7 flask celery celerybeat

我希望能够让我的应用程序的用户启动/停止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 -A celery_worker.celery beat -s ~/Documents/cesco-automation/power/celerybeat-schedule

它完美无缺!但我需要对日程安排有更多的控制权。

同样在我的app shell上,我能够做到这一点。

>>>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似乎不够锐利。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

即使我们为我们的应用程序放弃了flask / python。使用名为Kala的调度程序解决了此问题。这是一个简单的JSON over HTTP API,由Chronus提供,与Kala相同,但Airbnb提供了更强大,更可扩展的解决方案。它完全与语言无关。