5

を介して一度実行されるタスクcalculate_common_locationsCELERYBEAT_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
    },
    [..]
}

スケジュールには、1 日 1 回または10 秒ごとに実行されるタスクがさらに含まれています。これらのタスクは何度も再実行されないようです。セロリの花は、タスクが 20 回以上実行されたことを示しています。スケジュールどおりに開始された最初のものは、約 100 秒実行され、成功してから再び開始されます。

ここに画像の説明を入力

実行中の celerybeat は 1 つだけです。

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 秒間に数回) 挿入される大きなテーブル (> 100 万行) から読み取ります。Postgres ロックは、すべてのロックが許可されていることを示しています。

クエリがある時点で終了するため、タスクが再実行されている可能性はありますか?

次の場合は問題ありません。

  • タスクは django シェルから (直接または経由で.delay())実行されます。
  • タスクの内容は、軽量の SQL クエリ (select * from test) に置き換えられます。
  • タスクの内容はsleep(100)に置き換えられます。

バージョン:

  • セロリ==3.1.12
  • psql (PostgreSQL) 9.3.5
4

1 に答える 1