Celerybeat计划多次执行任务?

时间:2014-09-01 01:44:00

标签: python django database celery celerybeat

我有一个任务 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秒,成功,然后重新开始。

enter image description here

只有一个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锁显示所有锁都被授予。

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

以下时间没有问题:

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

版本:

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

1 个答案:

答案 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')