MNUにてインターンをさせていただいています、
豊橋技術科学大学の近藤です。
DjangoでBuild用のコマンドを作成しましたが、
そのまま使用すると、コマンド終了までページが戻ってこないので、
非同期処理を使用したいと思います。
Djangoで非同期処理を実装する際には、Celeryというモジュールを使うのが
一般的らしいです。Celeryはタスクキューを管理するインタフェースを提供しており、
内部で実際にキューイングするブローカーが必要でした。今回は、ブローカーに
Redisを使用します。
Redisのインストール
この状態で、.tasksのrun_buildを実行すると、Celeryがキューを受け取り
非同期処理を行ってくれる。
豊橋技術科学大学の近藤です。
DjangoでBuild用のコマンドを作成しましたが、
そのまま使用すると、コマンド終了までページが戻ってこないので、
非同期処理を使用したいと思います。
Djangoで非同期処理を実装する際には、Celeryというモジュールを使うのが
一般的らしいです。Celeryはタスクキューを管理するインタフェースを提供しており、
内部で実際にキューイングするブローカーが必要でした。今回は、ブローカーに
Redisを使用します。
インストール
django-celeryのインストールpip install django-celeryこの時、Celery本体も一緒にインストールされる
Redisのインストール
yum install redis
pip install redis
設定
setup.pyINSTALLED_APPS += ( 'djcelery', ) import djcelery djcelery.setup_loader() # BrokerサーバのURLを指定 Redisのポートはデフォルト6379 BROKER_URL = 'redis://127.0.0.1:6379/' # 実行結果のストア先 CELERY_RESULT_BACKEND = 'djcelery.backends.database.DatabaseBackend' # 実行できるメッセージのホワイトリスト CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml']
実行するタスクの記述
実行するアプリ内にtasks.pyを用意する。この中に非同期処理させる記述を書くのが一般的。from __future__ import absolute_import, unicode_literals from celery.task import Task from celery import shared_task from .apis import build logger = Task.get_logger() @shared_task def run_build(info): try: logger.info('build: %s', info) build(info) except Exception as e: logger.info('error occured in build: %s', info) logger.exception(e) else: logger.info('finish build: %s', info)
実行
Redisの起動redis-serverCeleryの起動
./manage.py celeryd
この状態で、.tasksのrun_buildを実行すると、Celeryがキューを受け取り
非同期処理を行ってくれる。
コメント
コメントを投稿