2014-09-01 131 views
4

我有一個任務calculate_common_locations它通過CELERYBEAT_SCHEDULE運行一次。 任務簡單地調用數據庫中的一個功能:Celerybeat計劃多次執行任務?

@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次。 第一個按計劃啓動,運行〜100s,成功,然後再次啓動。

enter image description here

只有一個celerybeat運行:

ps -Af | grep celerybeat 
foo  24359 779 0 01:53 ?  00:00:04 [celeryd: [email protected]: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 

我測試沒有- 併發性= 10開關。數據庫功能仍然執行多次。

該函數從大型表格(> 1 Mil行)中讀取,該表格經常插入(每秒幾次)。 Postgres鎖顯示所有鎖都被授予。

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

沒有問題時:

  • 的任務從Django的殼(直接或通過.delay())運行,
  • 任務的內容是由輕量級的SQL查詢(SELECT * FROM替代測試),
  • 任務的內容被替換爲sleep(100)

版本:

  • 芹菜== 3.1.12
  • PSQL(PostgreSQL的)9.3.5

回答

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') 
+0

愚蠢的我,謝謝。我添加了分鐘= 0,任務運行一次。 – kev 2014-09-09 01:11:28