Celery是Python開發的分布式任務調度模塊,包含以下組件:
- Celery Beat: 任務調度器,自帶的
- Celery Worker: 執行任務的消費者,通常設置多個
- Broker: 消息代理,就是任務隊列,我們使用redis
- Producer: 任務生產者,要執行的函數加上@app.task
- Result Backend: 結果保存,還是redis
Celery安裝
1 pip install celery[redis]
還要安裝redis
1 wget http://download.redis.io/releases/redis-2.8.17.tar.gz 2 tar xzf redis-2.8.17.tar.gz 3 cd redis-2.8.17 4 make 5 6 #啟動 7 ./src/redis-server redis.conf
首先實現一個最簡單的應用:
1 from celery import Celery 2 3 app = Celery('hello', broker='redis://localhost:6379/0') 4 5 @app.task 6 def hello(): 7 return 'hello world'
然后我們使用下面的命令啟動celery的worker:
1 celery -A tasks worker --loglevel=info
調度任務
>>> from tasks import add >>> add.delay(4, 4) >>> add.delay(4, 4).get() #獲取結果
集成celery到django中
在項目下新建celery.py
1 from __future__ import absolute_import #解決命名問題 2 3 import os 4 import django 5 6 from celery import Celery 7 from django.conf import settings 8 9 os.environ.setdefault('DJANGO_SETTINGS_MODULE','online.settings') #設置配置文件 10 django.setup() 11 12 app = Celery('online') 13 14 app.config_from_object('django.conf:settings') #制定celery配置文件 15 app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) #任務 16 app.conf.result_backend = ‘redis://localhost:6379/0’ #結果保持
settings.py配置
1 #配置Broker 2 BROKER_URL = 'redis://127.0.0.1:6379/0' 3 BROKER_TRANSPORT = 'redis'
郵件任務
1 from MxOnline.celery import app 2 3 @app.task 4 def send_register_email(email, send_type="register"): 5 pass
異步調用
1 #coding:utf-8 2 from django.shortcuts import render 3 from django.http import HttpResponse 4 5 from .tasks import send_register_email 6 7 def index(request): 8 send_register_email.delay() 9 return HttpResponse(u"郵件發送成功, 請查收")
最后運行:
1 進入online工程目錄運行: 2 celery -A online worker -l debug # -A 默認尋找目錄下的celery模塊
阿里雲
1 # 阿里雲封掉了25端口,這里使用SSL/465發送郵件 2 # 先安裝 django_smtp_ssl 3 pip install django_smtp_ssl 4 5 # settings 配置 6 EMAIL_HOST = "smtp.163.com" 7 EMAIL_PORT = 465 8 EMAIL_HOST_USER = "******@163.com" 9 EMAIL_HOST_PASSWORD = '******' 10 EMAIL_FROM = "******@163.com" 11 EMAIL_BACKEND = 'django_smtp_ssl.SSLEmailBackend'
