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

インターン(その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がキューを受け取り
非同期処理を行ってくれる。

コメント

このブログの人気の投稿

はじめまして!

はじめまして!
株式会社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(); shfor 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_program unzip /usr/p…

液晶ディスプレイのパネル構造に関する特許を取得しました

はじめまして、MNUの伊東です。
先日、液晶ディスプレイのパネル構造に関する特許を出願し、無事審査を通りましたのでこれからそれに関する技術的ポイントについて記載して参りたいと思います。