在django中使用celery
Django版本1.9.8
pip install django-celery
Redis要指定版本,默認的3.x版本有問題
Pip uninstall redis
pip install redis==2.10.6
創建django的app celery_course,並配置運行起來,作為celery的測試應用
Python manage.py startapp celery_course
將celery_course這個app拖入apps這個集合文件夾中
把celery_course加入settings.py配置中

定義views這個視圖
Celery_course/views.py
# _*_ coding:utf-8 _*_ from django.http import JsonResponse from celery_course.tasks import CourseTask from django.views.generic.base import View class DoView(View): def get(self, request): # 執行異步任務 print 'start to request' # CourseTask.delay() CourseTask.apply_async(args=('hello',),queue='work_queue') print 'end do request' return JsonResponse({'result': 'ok'})

定義url
Mxonline/urls.py
url(r'^celery_course/', include('celery_course.urls', namespace="celery_course")),

Celery_course/urls.py from django.conf.urls import url from .views import DoView urlpatterns = [ # 課程機構首頁 url(r'^do/$', DoView.as_view(), name="do"), ]
啟動django應用,訪問
Python manage.py runserver 0.0.0.0:8000
能正常訪問,說明django配置沒問題

接下來配置celery相關的內容
定義任務tasks.py
Celery_course/tasks.py
# _*_ coding:utf-8 _*_ # __author__ == 'jack' import time from celery.task import Task class CourseTask(Task): name = 'celery-course-task' def run(self, *args, **kwargs): print 'start celery_course task' time.sleep(5) print 'args={}, kwargs={}'.format(args, kwargs) print 'end course task '
配置celery
Mxonline/celeryconfig.py
# _*_ coding:utf-8 _*_ # __author__ == 'jack' import djcelery from datetime import timedelta djcelery.setup_loader() CELERY_IMPORTS = ( 'celery_course.tasks', ) CELERY_QUEUES = { 'beat_tasks': { 'exchange': 'beat_tasks', 'exchange_type': 'direct', 'binding_key': 'beat_tasks', }, 'work_queue': { 'exchange': 'work_queue', 'exchange_type': 'direct', 'binding_key':'work_queue' } } # 默認隊列 CELERY_DEFAULT_QUEUE = 'work_queue' # 有些情況可以防止死鎖 CELERYD_FORCE_EXECV = True # 設置並發的worker數量 CELERYD_CONCURRENCY = 4 # 允許重試 CELERY_ACKS_LATE = True # 每個worker最多執行100個任務被銷毀,可以防止內存泄露 CELERYD_MAX_TASKS_PER_CHILD = 100 # 單個任務的最大運行時間 CELERYD_TASK_TIME_LIMIT = 12 * 30 # 配置定時任務 CELERYBEAT_SCHEDULE = { 'task1': { 'task': 'celery-course-task', 'schedule': timedelta(seconds=5), 'options':{ 'queue': 'beat_tasks' } } }
將celery和django聯系起來,修改settings.py配置加入djcelery

導入celeryconfig配置
# 導入celery相關的配置 from .celeryconfig import * BROKER_BACKEND = 'redis' BROKER_URL = 'redis://localhost:6379/1' CELERY_RESULT_BACKEND = 'redis://localhost:6379/2'

啟動django

啟動worker
(mxonline) D:\python\mxonline>python manage.py celery worker --loglevel=info

啟動beat定時任務
(mxonline) D:\python\mxonline>python manage.py celery beat --loglevel=info
