Celerybeat计划多次执行任务?

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锁显示所有锁都被授予.

是否有可能重新运行任务,因为查询在某个时刻终止?

在以下情况下没有问题:

  • 任务从django shell(直接或通过.delay())运行,
  • 任务的内容被轻量级的sql查询替换(select*from test),
  • 任务的内容被睡眠(100)取代.

版本:

  • 芹菜== 3.1.12
  • psql(PostgreSQL)9.3.5

ask*_*sol 8

如果你考虑做什么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)