我有一个任务 calculate_common_locations ,它通过CELERYBEAT_SCHEDULE
运行一次。
该任务只是调用数据库中的一个函数:
@app.task
def calculate_common_locations():
db.execute("SELECT * FROM calculate_centroids('b')")
这是CELERYBEAT_SCHEDULE
中的条目:
CELERYBEAT_SCHEDULE = {
'common_locations': {
'task': 'clients.tasks.calculate_common_locations',
'schedule': crontab(hour=23, day_of_week='sun'), #every week
},
[..]
}
计划包括每天运行一次或每10秒的更多任务。这些任务似乎没有多次重新运行。 芹菜花显示任务执行超过20次。 第一个按计划开始,运行约100秒,成功,然后重新开始。
只有一个celerybeat在运行:
ps -Af | grep celerybeat
foo 24359 779 0 01:53 ? 00:00:04 [celeryd: celery@celery:MainProcess] -active- (worker --beat --app=cloud.celeryapp:app --concurrency=10 -l INFO -s /home/foo/run/celerybeat-schedule --pidfile=/home/foo/run/celerybeat.pid)
这是芹菜的开始方式(通过supervisord):
celery worker --beat --app=cloud.celery app:app --concurrency=10 -l INFO -s /home/foo/run/celerybeat-schedule --pidfile=/home/foo/run/celerybeat.pid
我在没有 - concurrency = 10 开关的情况下进行了测试。数据库功能仍然执行多次。
该函数从大表(> 1 Mil行)中读取,该表经常插入(每秒几次)。 Postgres锁显示所有锁都被授予。
是否有可能重新运行任务,因为查询在某个时刻终止?
以下时间没有问题:
.delay()
),版本:
答案 0 :(得分:8)
如果您考虑crontab(hour=23, day_of_week='sun')
做什么,这可能会更有意义:
>>> crontab(hour=23, day_of_week='sun')
<crontab: * 23 sun * * (m/h/d/dM/MY)>
所以这意味着任务将在每个星期天晚上11点执行每分钟。
如果您希望它仅在第一分钟执行,您可以指定:
crontab(minute=0, hour=23, day_of_week='sun')