【问题标题】:Celerybeat schedule executing task multiple times?Celerybeat计划多次执行任务?
【发布时间】:2014-10-25 05:08:08
【问题描述】:

我有一个任务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)         

这就是 celery 的启动方式(通过 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 百万行)中读取数据。 Postgres 锁显示所有锁都被授予。

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

在以下情况下没有问题:

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

版本:

  • celery==3.1.12
  • psql (PostgreSQL) 9.3.5

【问题讨论】:

    标签: python django database celery celerybeat


    【解决方案1】:

    如果您考虑一下 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')
    

    【讨论】:

    • 愚蠢的我,感谢您的启发。我添加了 minute=0 并且任务运行一次。
    猜你喜欢
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 2013-02-11
    • 2019-06-01
    • 2012-08-13
    • 2012-02-07
    • 1970-01-01
    相关资源
    最近更新 更多