芹菜捶打开始时运行芹菜任务

时间:2015-08-01 17:51:15

标签: django celery

当我在1小时左右再次开始芹菜时,如何安排任务运行。

目前我在settings.py中有时间表:

CELERYBEAT_SCHEDULE = {
    'update_database': {
        'task': 'myapp.tasks.update_database',
        'schedule': timedelta(seconds=60),
    },
}

我在stackoverflow上看到了一年的帖子,问了同样的问题: How to run celery schedule instantly?

然而这对我不起作用,因为当我运行django服务器时,我的芹菜工作者得到3-4个相同任务的请求

我开始做我的工作并且这样打败:

celery -A dashboard_web worker -B --loglevel=INFO --concurrency=10

2 个答案:

答案 0 :(得分:1)

尝试设置配置参数CELERY_ALWAYS_EAGER = True

像这样的东西

app.conf.CELERY_ALWAYS_EAGER = True

答案 1 :(得分:0)

Crontab时间表

您可以尝试使用crontab计划,该计划将每小时运行一次,并在初始化计划程序后1分钟开始。 警告:您可能需要在几分钟后再执行一次,以防启动时间更长,否则可能需要等待一整个小时。

from celery.schedules import crontab
from datetime import datetime

CELERYBEAT_SCHEDULE = {
    'update_database': {
        'task': 'myapp.tasks.update_database',
        'schedule': crontab(minute=datetime.now().minute+1),
    },
}

参考:http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html#crontab-schedules

MyAppConfig的就绪方法

为了确保您的任务立即运行,可以使用与之前相同的方法来创建定期任务,而无需将1添加到minute中。然后,您可以在ready的{​​{1}}方法中调用您的任务,只要您的应用已准备就绪,就会调用该方法。

MyAppConfig

请注意,如果要使用#myapp/apps.py class MyAppConfig(AppConfig): name = "myapp" def ready(self): from .tasks import update_database update_database.delay() ,也可以直接通过ready方法创建定期任务。

编辑: 您提到的链接中没有发现第二种方法。我将其保留在这里,以防其他人到达这里有用。