Mawa Town

Mawaという人が作る小さな町でMawaTownです。技術と音楽が好き。

Django-Celeryにスケジュールをセットして動くようにする@ローカル

コメント

Celery(セロリ)のスケジューラーを使います

追記部分

#settings.py

from datetime import timedelta

CELERYBEAT_SCHEDULE = {
    'add-every-300-seconds': {
        'task': '<app名>.tasks.test_def',
        'schedule': timedelta(seconds=300),
        'args': (16, 16)
    },
}

CELERY_TIMEZONE = 'Asia/Tokyo'

なんかどうも5分に1回の起動が最短ペースの模様。数秒に一回だとcelery側でエラーがでた。

つぎに走らせる関数

#<app名>.tasks.py

@shared_task
def test_def():
    print("scheduler is fine!")
celery.beat.SchedulingError: Couldn't apply scheduled task add-every-300-seconds: test_def() takes 0 positional arguments but 2 were given

こうしていると、このエラーがでる。どうもスケジューラー経由の実行だと、たくさん規定の引数をぶちこむようだ。

note.nkmk.me

なので、 ↓
こうする。*argsをつけて可変長で引数を受け入れられるようにする。

#<app名>.tasks.py

@shared_task
def test_def(*args):
    print("scheduler is fine!")

これでよし。

Cerelyの起動もスケジューラー利用時は-Bオプションをつける

$ celery -A [proj名] worker -l info


こうする

$ celery -A [proj名] worker -l info -B

これでうまく動いた!^^/

参考

Periodic Tasks — Celery 4.2.0 documentation