1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DjangoでCeleryとRedisを使って非同期処理

Posted at

Djangoで処理に時間がかかる機能があったので、どうにかならんものかと調べたらCeleryRedisなるものを発見。その時の備忘録。

必要なパッケージをインストール

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.

おお、できた!
便利ですね〜

本番環境のデーモン化チュートリアルも公式にあるのでやってみる。
次はそのあたりも記事にしようかと思います!

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?