django非同期タスクcelery,分散キュー(redis/rabbitmq)


非同期タスク用celery.
キューはredis,rabbitmqの2種類を使用しています
        
Celeryの考え方:
(1)引用celery
    #coding:utf-8
from __future__ import absolute_import
from celery import Celery

app = Celery('T1',include=['T1.tasks','T1.call_tasks'])
app.config_from_object('T1.config')

if __name__ ==  '__main__':
    app.start()

(2)引用celery構成
#coding:utf-8

from __future__ import absolute_import
from datetime import timedelta
from  time import  timezone

CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
BROKER_URL = 'redis://127.0.0.1:6379/0'

CELERY_TASK_SERIALIZER='json'
CELERY_ACCEPT_CONTENT=['json']
CELERY_RESULT_SERIALIZER='json'
CELERY_TIMEZONE='Europe/Oslo'
CELERY_ENABLE_UTC=True

CELERYBEAT_SCHEDULE = {
    'add-every-5-seconds':{
        'task':'T1.tasks.add',
        'schedule':timedelta(seconds=5),
        'args':(16,16),
    },
    'add-every-10-seconds':{
        'task':'T1.call_tasks.call_tasks',
        'schedule':timedelta(seconds=10),
        'args':(16,16),
    },
    'add-every-10-seconds':{
        'task':'T1.call_tasks.call_task2',
        'schedule':timedelta(seconds=10),
        'args':(16,16),
    }


}

              (3)
任務をceleryに入れる
    #coding:utf-8
from __future__ import absolute_import
from T1.celery import app
# brokers = 'redis://127.0.0.1:6379/0'
# backend = 'redis://127.0.0.1:6379/1'
#
# app = Celery('tasks',broker=brokers,backend=backend)

@app.task
def add(x,y):
    z = x+y
    return z

              (4)
呼び出したタスクもceleryに入れてタイミングよく走ります
#coding:utf-8
from __future__ import absolute_import
from T1.tasks import add
from T1.celery import app
import json


@app.task
def call_tasks(n=100,m=200):
    r = add.delay(2,6)
    with open('/Users/admin/devops/Django_T1/celery.txt','wb+') as f:
        f.write(str(r.ready())+str("   :"+str(r.get()))+"\r
") @app.task def call_task2(n=100,m=200): r = add.delay(3,6) with open('/Users/admin/devops/Django_T1/celery.txt','wb+') as f: f.write(str(r.ready())+str(" :"+str(r.get()))+"\r
")

 
redisの起動
celeryの実行
      celery -A T1 worker -B -l info
     
実行結果:
Falseの結果は:9
Falseの結果は:9
Falseの結果は:9
Falseの結果は:9
Falseの結果は:9
Falseの結果は:9
Falseの結果は:9
Falseの結果は:9
Falseの結果は:9
Falseの結果は:9
Falseの結果は:9
Falseの結果は:9
Falseの結果は:9
Falseの結果は:9
Falseの結果は:9
Falseの結果は:9
True結果:9
Falseの結果は:9
Falseの結果は:9
Falseの結果は:9
 
生産者、消費者がredisに置くのは1回の消費で、1回取ったら、なくなります
 
以上はredisベースのキューです.次はrabbitmqベースのキューです
考え方は同じですが、rabbitmqをインストールするのに少し時間がかかります.
rabbitmq取付及び異常処理
        http://hugoren.iteye.com/blogs/2303162
        
reference:
http://www.jianshu.com/p/1840035cb510
http://docs.jinkan.org/docs/celery/index.html