kev*_*kev 5 python database django celery celerybeat
我有一个任务calculate_common_locations,它运行一次CELERYBEAT_SCHEDULE
.该任务只是调用数据库中的函数:
@app.task
def calculate_common_locations():
db.execute("SELECT * FROM calculate_centroids('b')")
Run Code Online (Sandbox Code Playgroud)
这是条目CELERYBEAT_SCHEDULE
:
CELERYBEAT_SCHEDULE = {
'common_locations': {
'task': 'clients.tasks.calculate_common_locations',
'schedule': crontab(hour=23, day_of_week='sun'), #every week
},
[..]
}
Run Code Online (Sandbox Code Playgroud)
该计划包括每天运行一次或每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)
Run Code Online (Sandbox Code Playgroud)
这就是芹菜的开始方式(通过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
Run Code Online (Sandbox Code Playgroud)
我没有使用--concurrency = 10开关测试它.数据库功能仍然执行多次.
该函数从一个大表(> 1 Mil行)中读取,该表经常插入(每秒几次).Postgres锁显示所有锁都被授予.
是否有可能重新运行任务,因为查询在某个时刻终止?
在以下情况下没有问题:
.delay()
)运行,版本:
如果你考虑做什么crontab(hour=23, day_of_week='sun')
,这可能会更有意义:
>>> crontab(hour=23, day_of_week='sun')
<crontab: * 23 sun * * (m/h/d/dM/MY)>
Run Code Online (Sandbox Code Playgroud)
所以这意味着任务将在每个星期天晚上11点每分钟执行一次.
如果您希望它仅在第一分钟执行,您可以指定:
crontab(minute=0, hour=23, day_of_week='sun')
Run Code Online (Sandbox Code Playgroud)