Djangoで処理に時間がかかる機能があったので、どうにかならんものかと調べたらCeleryとRedisなるものを発見。その時の備忘録。
必要なパッケージをインストール
pip install celery
pip install django-celery-results
pip install redis
pip install django-redis
pip install django-celery-beat
brew install redis
settings.pyを編集
# ブローカーにredisを指定
CELERY_BROKER_URL = os.environ.get('REDIS_URL', 'redis://localhost:6379/1')
# 結果の保存先(今回はPostgreSQL)
CELERY_RESULT_BACKEND = "django-db"
# task状態が開始になったかを確認できるための設定
CELERY_TASK_TRACK_STARTED = True
INSTALLED_APPS = [
...
'django_celery_results', # 追加
]
アプリケーションディレクトリ配下にcelery.pyを作成
import os
from celery import Celery
# celeryで使うDjangoの設定ファイル(settings.py)を指定
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '〇〇.settings')
app = Celery('〇〇')
# Djangoのconfigファイルをceleryのconfigとして使う宣言、
app.config_from_object('django.conf:settings', namespace='CELERY')
# 登録された全ての Django アプリの設定から、タスクモジュールをロードします。
app.autodiscover_tasks()
中身は公式ほぼそのまま。
settings.pyと同じ階層の__init__.pyも編集。
# 追加
from .celery import app as celery_app
__all__ = ('celery_app',)
非同期処理のタスクとして登録
from celery import shared_task #インポート
@shared_task #@shared taskとすることでCeleryのタスクとしてロードされる
def 〇〇(x):
...
views.pyを編集
from celery.result import AsyncResult #インポート
task = 〇〇.delay(x) #非同期の呼び出しは.delayこれだけ。
id = task.id #タスクに割り振られるID取得できる
起動する
まずdjangoアプリ
python manage.py makemigrations # migrationファイルを作成(必要な場合)
python manage.py migrate # migrate実行
Celeryがバックで利用するテーブルを自動的に作ってくれる。凄い。
django起動。
python manage.py rumserver # アプリケーション実行
redis起動!
redis-server
celery起動!
celery -A proj worker -l INFO
ちなみにコマンドラインのオプションはこれ見れる
celery help
起動するとこんな感じで表示される
--------------- celery@halcyon.local v4.0 (latentcall)
--- ***** -----
-- ******* ---- [Configuration]
- *** --- * --- . broker: amqp://guest@localhost:5672//
- ** ---------- . app: __main__:0x1012d8590
- ** ---------- . concurrency: 8 (processes)
- ** ---------- . events: OFF (enable -E to monitor this worker)
- ** ----------
- *** --- * --- [Queues]
-- ******* ---- . celery: exchange:celery(direct) binding:celery
--- ***** -----
[20**-**-** **:**:**,***: WARNING/MainProcess] celery@halcyon.local has started.
おお、できた!
便利ですね〜
本番環境のデーモン化チュートリアルも公式にあるのでやってみる。
次はそのあたりも記事にしようかと思います!