バージョン: | 2.7.0 |
---|---|
ウェブ: | http://django-celery-beat.readthedocs.io/ |
ダウンロード: | http://pypi.python.org/pypi/django-celery-beat |
ソース: | http://github.com/celery/django-celery-beat |
キーワード: | ジャンゴ、セロリ、ビート、定期タスク、cron、スケジューリング |
この拡張機能を使用すると、定期的なタスクのスケジュールをデータベースに保存できます。
定期タスクは Django 管理インターフェイスから管理でき、定期タスクの作成、編集、削除、およびタスクの実行頻度を設定できます。
この拡張機能の使用方法とインストール手順は、Celery のドキュメントから入手できます。
警告
Django TIME_ZONE
設定を変更しても、定期タスクのスケジュールは古いタイムゾーンに基づいたままになります。
これを修正するには、各定期タスクの「最終実行時間」をリセットする必要があります。
>> > from django_celery_beat . models import PeriodicTask , PeriodicTasks
>> > PeriodicTask . objects . all (). update ( last_run_at = None )
>> > PeriodicTasks . update_changed ()
注記
これにより、定期タスクが以前に実行されなかったかのように状態がリセットされます。
django_celery_beat.models.PeriodicTask
このモデルは、実行される単一の定期タスクを定義します。
タスクを実行する頻度を定義するスケジュールに関連付ける必要があります。
django_celery_beat.models.IntervalSchedule
特定の間隔 (5 秒ごとなど) で実行されるスケジュール。
django_celery_beat.models.CrontabSchedule
cron のエントリのようなフィールドを持つスケジュール: minute hour day-of-week day_of_month month_of_year
。
django_celery_beat.models.PeriodicTasks
このモデルは、スケジュールがいつ変更されたかを追跡するためのインデックスとしてのみ使用されます。
PeriodicTask
更新するたびに、このテーブル内のカウンターもインクリメントされ、データベースからスケジュールを再ロードするようにcelery beat
サービスに指示します。
定期タスクを一括更新する場合は、カウンタを手動で更新する必要があります。
>> > from django_celery_beat . models import PeriodicTasks
>> > PeriodicTasks . update_changed ()
一定の間隔で実行する定期タスクを作成するには、まず間隔オブジェクトを作成する必要があります。
>> > from django_celery_beat . models import PeriodicTask , IntervalSchedule
# executes every 10 seconds.
>> > schedule , created = IntervalSchedule . objects . get_or_create (
... every = 10 ,
... period = IntervalSchedule . SECONDS ,
... )
必要なフィールドは、期間の種類と頻度だけです。
特定の期間のセットから選択できます。
IntervalSchedule.DAYS
IntervalSchedule.HOURS
IntervalSchedule.MINUTES
IntervalSchedule.SECONDS
IntervalSchedule.MICROSECONDS
注記
10 秒ごとに実行される複数の定期タスクがある場合、それらはすべて同じスケジュール オブジェクトを指す必要があります。
これをユーザーに提示する必要がある場合に使用できる「選択肢タプル」もあります。
>> > IntervalSchedule . PERIOD_CHOICES
スケジュール オブジェクトを定義したので、定期的なタスク エントリを作成できます。
>> > PeriodicTask . objects . create (
... interval = schedule , # we created this above.
... name = 'Importing contacts' , # simply describes this periodic task.
... task = 'proj.tasks.import_contacts' , # name of task.
... )
これは非常に基本的な例であることに注意してください。タスクの実行に使用される引数とキーワード引数、タスクの送信先queue
[*]、および有効期限を設定することもできます。
引数を指定する例を次に示します。JSON シリアル化がどのように必要かに注目してください。
>> > import json
>> > from datetime import datetime , timedelta
>> > PeriodicTask . objects . create (
... interval = schedule , # we created this above.
... name = 'Importing contacts' , # simply describes this periodic task.
... task = 'proj.tasks.import_contacts' , # name of task.
... args = json . dumps ([ 'arg1' , 'arg2' ]),
... kwargs = json . dumps ({
... 'be_careful' : True ,
... }),
... expires = datetime . utcnow () + timedelta ( seconds = 30 )
... )
[*] | exchange とrouting_key フィールドを使用して、低レベル AMQP ルーティングを使用することもできます。 |
crontab スケジュールには、 minute
、 hour
、 day_of_week
、 day_of_month
、 month_of_year
というフィールドがあるため、 30 * * * *
(毎時 30 分経過後に実行) の crontab エントリに相当するものが必要な場合は、次のように指定します。
>> > from django_celery_beat . models import CrontabSchedule , PeriodicTask
>> > schedule , _ = CrontabSchedule . objects . get_or_create (
... minute = '30' ,
... hour = '*' ,
... day_of_week = '*' ,
... day_of_month = '*' ,
... month_of_year = '*' ,
... timezone = zoneinfo . ZoneInfo ( 'Canada/Pacific' )
... )
crontab スケジュールは、「timezone」入力パラメータを使用して特定のタイムゾーンにリンクされます。
次に、このスケジュールを使用して定期タスクを作成するには、このドキュメントで前述した間隔ベースの定期タスクと同じ方法を使用しますが、 interval=schedule
の代わりにcrontab=schedule
を指定します。
>> > PeriodicTask . objects . create (
... crontab = schedule ,
... name = 'Importing contacts' ,
... task = 'proj.tasks.import_contacts' ,
... )
enabled
フラグを使用すると、定期タスクを一時的に無効にすることができます。
>> > periodic_task . enabled = False
>> > periodic_task . save ()
定期的なタスクを実行するには、依然として「ワーカー」が必要です。したがって、デフォルトのCeleryパッケージがインストールされていることを確認してください。 (インストールされていない場合は、こちらのインストール手順に従ってください: https://github.com/celery/celery)
Worker サービスと Beat サービスの両方を同時に実行する必要があります。
Celery ワーカー サービスを開始します (Django プロジェクト名を指定します)。
$ celery -A [プロジェクト名] ワーカー --loglevel=info
別のプロセスとして、ビート サービスを開始します (Django スケジューラーを指定します)。
$ celery -A [プロジェクト名] beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
または、 -S (スケジューラー フラグ) を使用できます。その他のオプションについては、 celery beat --help
を参照してください。
$ celery -A [プロジェクト名] Beat -l info -S django
また、別の方法として、上記の 2 つの手順 (ワーカー サービスとビート サービス) を 1 つのコマンドだけで実行することもできます (開発環境のみに推奨)。
$ celery -A [プロジェクト名] worker --beat --scheduler django --loglevel=info
Django 管理インターフェイスから定期タスクを追加および管理できるようになりました。
django-celery-beat は、Python Package Index (PyPI) 経由またはソースからインストールできます。
pip
使用してインストールするには:
$ pip install --upgrade django-celery-beat
最新バージョンの django-celery-beat を http://pypi.python.org/pypi/django-celery-beat からダウンロードします。
次の手順でインストールできます。
$ python3 -m venv .venv
$ source .venv/bin/activate
$ pip install --upgrade build pip
$ tar xvfz django-celery-beat-0.0.0.tar.gz
$ cd django-celery-beat-0.0.0
$ python -m build
$ pip install --upgrade .
インストール後、 django_celery_beat
を Django の設定モジュールに追加します。
INSTALLED_APPS = [
...,
'django_celery_beat' ,
]
以下を使用してdjango_celery_beat
移行を実行します。
$ python manage.py migrate django_celery_beat
次の pip コマンドを使用して、django-celery-beat の最新のメイン バージョンをインストールできます。
$ pip install git+https://github.com/celery/django-celery-beat#egg=django-celery-beat
http://127.0.0.1:58000/admin/ で Django 管理者を使用して django-celery-beat のローカル開発コピーをスピンアップするには、次のコマンドを実行します。
$ docker-compose up --build
ユーザーadmin
としてパスワードadmin
を使用してログインします。
タイムゾーンに対応していないプロジェクトがある場合は、設定ファイルでDJANGO_CELERY_BEAT_TZ_AWARE=False
を設定できます。
django-celery-beat および他の何千ものパッケージのメンテナは、Tidelift と協力して、アプリケーションの構築に使用するオープンソースの依存関係に対する商用サポートとメンテナンスを提供しています。使用する正確な依存関係の保守者に料金を支払いながら、時間を節約し、リスクを軽減し、コードの健全性を向上させます。もっと詳しく知る。