を介して一度実行されるタスク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