記事ディレクトリ
個人サイトにも同時掲載: http ://panzhixiang.cn/article/2023/3/16/68.html
1. 背景の紹介
私たちは以前、スケジュールされたタスクを管理するために k8s cronjob を使用していました。スケジュールされたタスクに関連するコードを個別にポッドにカプセル化し、 cronjob メソッドを使用してそれをトリガーします。
この方法は操作が非常に簡単で、サードパーティのリソース (Redis など) に依存しませんが、明らかな欠点もあります。
時限タスクのコードは Django コードから分離されているため、Django の多くの機能は使用できず、DRF によってカプセル化された API を介してのみ Django サーバーと通信できます。
スケジュールされたタスクは、多くの API をカプセル化する必要があり、認証などの問題も考慮する必要があり、非常に面倒なので、新しいプロジェクトでスケジュールされたタスクを管理する方法を変更する予定です。
Python と Django の両方を使用するエンジニアは、非同期タスクに適したフレームワークである Celery をおそらく知っているでしょう。最後に使ったのは2020年で、近年セロリの使い方が変わってきていることに気付き、ネットで調べても良い中国語の教材が見つからなかったので、少しでもお役に立てればと思い、関連ブログを自分で書きました。関連情報を調べる必要がある人のためのちょっとした助けになります。
2、セロリの設定
Celery を構成する前に、まず Celery をインストールし、それから構成を開始する必要がありますpip install celery
。
構成の導入を正式に開始する前に、次の文章をより明確に表現できるように、いくつかの前提条件が必要です。
django-admin startproject proj
Django プロジェクトを作成しましょう。Django のバージョンは 3.0 以上である必要があります。作成が成功すると、次のディレクトリ構造が得られます。
proj
├── manage.py
└── proj
├── asgi.py
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
Django に詳しい方であれば上記のディレクトリ ツリーはよくご存知だと思いますが、以下の内容はこのディレクトリ ツリーを基に記述されているため、このディレクトリ ツリーを覚えておく必要があります。
1. Celery インスタンスを定義する
Celery インスタンスを定義するには、上記のディレクトリ ツリーにファイル proj/proj/celery.py を作成する必要があります。
ファイル名はcelery.pyで、 settings.py と同じディレクトリにあります。
内容は以下の通りです。コード内に重要な情報をコメント形式で記載していますので、注意してご確認ください。
import os
from celery import Celery
# 这个配置可以避免在其他的tasks.py中初始化django配置,虽然不是必须的,但是强烈建议要有这个配置
os.environ.setdefault(
'DJANGO_SETTINGS_MODULE', 'proj.settings'
)
# 这个就是从环境变量中获取redis的地址,我这里使用redis作为broker
REDIS_HOST = os.getenv('REDIS_HOST', 'localhost:6379')
app = Celery(
'proj', # 第一个参数是为celery的实例起了一个名字,这里叫做proj
backend='redis://' + REDIS_HOST + '/1',
broker='redis://' + REDIS_HOST + '/0',
)
# 可以用这个方法批量配置celery,
# 这几个配置在一帮的场景中就足够使用了
# 另外,其实还有几种其他方法来配置celery,但是我觉得这个方法对于不是非常大的项目来说就足够了。
app.conf.update(
task_serializer='json',
accept_content=['json'], # Ignore other content
result_serializer='json',
enable_utc=True,
)
# 这一行会从django的settings文件中获取一些celery的配置
# namespace等于CELERY的意思是settings中以 “CELERY_” 开头的配置都会被识别为celery的配置
app.config_from_object('django.conf:settings', namespace='CELERY')
# 会自动发现所有Django app中的任务
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print(f'Request: {
self.request!r}')
上記の設定に加えて、他に 2 つの場所を設定する必要があります。
1 つ目は、proj/proj/__init__.pyに以下を追加することです。
from .celery import app as celery_app
__all__ = ('celery_app',)
その役割は、Django の起動時に celery を自動的にロードすることです。
もう 1 つは、django 設定に celery 設定を追加する必要があることです。これは、app.config_from_object('django.conf:settings', namespace='CELERY')
上記のコードで言及されている部分です。
CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60 # 单个任务的最大运行时间,单位是秒
2. タスクの結果を文書化する
タスクのスケジュール設定にセロリを使用する場合、将来の参照のために各タスクの結果を記録することが最善です。特にタスクが期待どおりに実行されない場合、これはさらに重要です。
公式 Web サイトでは、タスクの結果を記録するために django-celery-results を使用することを推奨しています。
- インストール
pip install django-celery-results
- django-celery-resultsの登録は
別の django アプリであるため、settings.py に登録する必要があります。
登録後、データベースを移行する必要があります。INSTALLED_APPS = ( ..., 'django_celery_results', )
python manage.py migrate django_celery_results
- django-celery-resultsの設定は
、タスク結果を自動的に保存するための単なるパッケージです。最終データは、ある場所に配置する必要があります。データベース、ローカル ファイル システム、Redis など、タスク結果の保存に使用できる場所は数多くあります。 、など。ここではデータベースを使用します。データベースを使用することもお勧めします。
django の settings.py に設定を追加します。CELERY_RESULT_BACKEND = 'django-db' # 使用数据库做后端 CELERY_CACHE_BACKEND = 'django-cache' # 老实说,不知道这个缓存配置到底有什么作用,但是官网推荐使用这个配置,我也就留着了 CELERY_CACHE_BACKEND = 'default'
- このコマンドは第 1 レベルの proj ディレクトリで実行する必要があることに注意してください
。実行しないと、構成ファイルが見つからないことを示すエラーが報告されます。celery -A backend worker --loglevel=INFO
3. タイミングタスクの設定
セロリの設定方法は以前に紹介しましたが、セロリが利用できるようになったところで、スケジュールされたタスクを管理するにはどうすればよいでしょうか? 今回は django-celery-beat を使用しますが、使い方は比較的簡単です。
1. django-celery-beat を設定する
- インストール
pip install django-celery-beat
- 登録
djangoのsettings.pyに登録
同様に、登録後にデータベースを移行するには、INSTALLED_APPS = ( ..., 'django_celery_beat', )
python manage.py migrate django-celery-beat
- このコマンドは第 1 レベルの proj ディレクトリで実行する必要があることに注意してください
。実行しないと、構成ファイルが見つからないことを示すエラーが報告されます。celery -A proj beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler
個別に説明したいのは、多くの人がタイミング タスク管理に django_celery_beat を使用する場合、コード内の cronjob の形式でタイミング タスクをカプセル化することを好みますが、私は Django Admin ページを通じてデータベース内でタイミング タスクを構成することを好むということです。
コード内にカプセル化されているため、将来的にスケジュールされたタスクを変更したい場合は、コードを書き直して環境に展開する必要がありますが、これはあまりフレンドリーではなく、技術者以外の人にとっては、設定を変更する可能性があります。自分でスケジュールしたタスクはほぼゼロです。
2. Django Admin を通じて特定の時間指定タスクを設定する
この部分の内容は比較的簡単です Djangoを起動し、Adminページにログインし、ページ上のCreateをクリックするだけです 難しくはありませんが、書こうとすると大量の画像を接続する必要があるので、書かないでください本当は書きたくない。