当我在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
答案 0 :(得分:1)
尝试设置配置参数CELERY_ALWAYS_EAGER = True
像这样的东西
app.conf.CELERY_ALWAYS_EAGER = True
答案 1 :(得分:0)
您可以尝试使用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
为了确保您的任务立即运行,可以使用与之前相同的方法来创建定期任务,而无需将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
方法创建定期任务。
编辑: 您提到的链接中没有发现第二种方法。我将其保留在这里,以防其他人到达这里有用。