異步任務用提celery.
隊列用的是redis,rabbitmq兩種
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\n")
@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\n")
啟動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是一次消費,一次取了,就沒了
以上是基于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