我如何安排一个任务在我开始芹菜节拍时运行,然后在1小时左右再次运行。
目前我在settings.py:
CELERYBEAT_SCHEDULE = {
'update_database': {
'task': 'myapp.tasks.update_database',
'schedule': timedelta(seconds=60),
},
}
我在stackoverflow上看到一篇一年前的帖子,问了同样的问题:如何立即运行芹菜时间表?
然而,这并不适用于我,因为我的芹菜工作得到3-4个请求相同的任务,当我运行django server
我正在启动我的worker和beat:
celery -A dashboard_web worker -B --loglevel=INFO --concurrency=10
Crontab schedule
您可以尝试使用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) % 60),
},
}
参考:http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html crontab-schedules
MyAppConfig的Ready方法为了确保您的任务立即运行,您可以使用与前面相同的方法创建周期性任务,而不将1
添加到minute
中。然后,在MyAppConfig
的ready
方法中调用任务,该方法在应用程序准备好时调用。
#myapp/apps.py
class MyAppConfig(AppConfig):
name = "myapp"
def ready(self):
from .tasks import update_database
update_database.delay()
请注意,如果您要使用django_celery_beat
,您也可以直接在ready
方法中创建周期性任务。
编辑:没有看到第二个方法已经涵盖在您提到的链接中。
尝试设置配置参数CELERY_ALWAYS_EAGER = True
像这样
app.conf.CELERY_ALWAYS_EAGER = True