簡體   English   中英

Celerybeat計划多次執行任務?

[英]Celerybeat schedule executing task multiple times?

我有一個任務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鎖顯示所有鎖都被授予。

是否有可能重新運行任務,因為查詢在某個時刻終止?

在以下情況下沒有問題:

  • 任務從django shell運行(直接或通過.delay() ),
  • 任務的內容被輕量級的sql查詢替換(select * from test),
  • 任務的內容被睡眠(100)取代。

版本:

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

如果考慮crontab(hour=23, day_of_week='sun')作用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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM