スキップしてメイン コンテンツに移動

インターン(その9) Djangoで非同期処理

MNUにてインターンをさせていただいています、
豊橋技術科学大学の近藤です。

DjangoでBuild用のコマンドを作成しましたが、
そのまま使用すると、コマンド終了までページが戻ってこないので、
非同期処理を使用したいと思います。

Djangoで非同期処理を実装する際には、Celeryというモジュールを使うのが
一般的らしいです。Celeryはタスクキューを管理するインタフェースを提供しており、
内部で実際にキューイングするブローカーが必要でした。今回は、ブローカーに
Redisを使用します。

インストール

django-celeryのインストール
pip install django-celery
この時、Celery本体も一緒にインストールされる

Redisのインストール
yum install redis
pip install redis 

設定

setup.py
INSTALLED_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-server
Celeryの起動
./manage.py celeryd

この状態で、.tasksのrun_buildを実行すると、Celeryがキューを受け取り
非同期処理を行ってくれる。

コメント

このブログの人気の投稿

INTEROP Tokyo2015

6月11日(木)Interop Tokyoへ行ってきました。 私の目当ては、CITRIX社 ブース会場で行われた クラウド・エバンジェリストの北瀬公彦さんと常田秀明さんの講演です CITRIX社のロードバランサーであるネットスケーラーの活用事例を IBM社のクラウドサービスSoftLayerを例に説明されていました。 CITRIX社は、IBM社のグローバル提携企業だから、 CITRIX社のロードバランサーであるネットスケーラーと SoftLayer は、セットで説明されていました。 SoftLayer は、データセンターをプライベートにつなぐネットワークだっていう話でしたので、 IBM社のSoftLayer の物理サーバーを使えば、 データセンターをクラウド化ができる。 (オンプレミスの環境をそのまあ維持してデータセンターへ移行できる) 従来のオンプレミスユーザー最適だってことでした。 そのため、仮想化とか、クラウドがどうかとか説明必要ないということになり、 企業の情報システム担当者は、安心して使えるし、経営者にも説明しやすいと思いました。 自前で仮想化システム研究できる余裕はなく、 PaaSは不安という感じがあれば、 SoftLayerのIaaSサービスって、選択しやすいし、わかりやすい。 最適なクラウド基盤を選択できるっていいなと思いました。

はじめまして!

はじめまして! 株式会社MNUで新しくブログを始めます。 主に、プログラムに関する技術的なことを中心に社員が持ち回りで書いていきます。 皆様のお役に立てれば幸いです。 どうぞ、これからよろしくお願いします。 ここから下はコードを表示するサンプルです。 int x = foo(); /* This is a comment This is not code Continuation of comment */ int y = bar(); // This is line 4. foo(); bar(); baz(); boo(); far(); faz(); sh for target do WORKDIR=$(mktemp -d "$EXTRACTHOMEDIR"/XXXXXX) case "$target" in *.[Tt][Gg][Zz]|*.[Tt][Aa][Rr].[Gg][Zz]|*.[Tt][Aa][Rr].[Zz]) tar vzxf "$target" -C "$WORKDIR" move_to_currentpath "$WORKDIR" "$target" ;; *.[Tt][Bb][Zz]|*.[Tt][Aa][Rr].[Bb][Zz]2) tar vjxf "$target" -C "$WORKDIR" move_to_currentpath "$WORKDIR" "$target" ;; *.[Gg][Zz]) gzip -d "$target" move_to_currentpath "$WORKDIR" "$target" ;; *.[Zz][Ii][Pp]|*.[JjWw][Aa][Rr]) check_required_pro