環境版本:html
windows7 x64python
django 1.11.6redis
django-celery 3.2.2django
工程結構說明:源碼下載請訪問https://i.cnblogs.com/Files.aspxwindows
一、新建django項目DjangoCelery(具體請參考http://www.javashuo.com/article/p-zqplhrew-a.html),並啓動,啓動方式包括2種:瀏覽器
1)經過eclipse,右擊項目名稱,Run As----Pydev:Djangosession
2)在manage.py文件所在路徑執行命令:python manage.py runserver 0.0.0.0:8000併發
本次啓動採用方式1,啓動成功後,控制檯日誌打印信息以下:app
二、在...\testdj\testdj\testdj下新建celery配置文件celeryconfig.py:eclipse
# -*- coding: utf-8 -*- ''' Created on 2019年8月28日 @author: lenovo ''' import celery import djcelery #當djcelery.setup_loader()運行時,Celery便會去查看INSTALLD_APPS下包含的全部app目錄中的tasks.py文件,找到標記爲task的方法,將它們註冊爲celery task。 djcelery.setup_loader() #設置不一樣的隊列,不要只使用默認的隊列,這樣當任務比較多的時候任務之間會相互影響(例如將普通任務和定時任務混在一塊兒), 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' #設置默認隊列,若不指定隊列則使用該隊列 CELERY_IMPORTS=( 'course.tasks', ) #參數配置可參考官網:http://docs.celeryproject.org/en/latest/userguide/configuration.html CELERY_ACKS_LATE=True #容許重試 CELERYD_FORCE_EXECV=True #可讓Celery更加可靠,只有當worker執行完任務後,纔會告訴MQ,消息被消費,防治死鎖 CELERYD_CONCURRENCY=4 #設置併發的worker數量 CELERYD_MAX_TASKS_PRE_CHILD=100 #每一個worker最多執行100個任務被銷燬,能夠防止內存泄露 CELERYD_TASK_TIME_LIMIT=12*30 #單個任務的最大運行時間爲6分鐘,超過的話就被殺掉
三、在項目路徑...\testdj\testdj下新建app,命名爲course
右擊項目名稱testdj,選擇Django---create application(mange.py startapp),輸入app名稱完成建立;
四、將新建的course這個app和djcelery模塊註冊到settings.py中:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles',
'djcelery', 'course', ]
註冊djcelery是爲了後續經過manage.py使用其相關命令 ;
五、創建Celery與django的關係,包括broker和backend設置,在settings.py中完成相關配置:
#Celery from celeryconfig import * BROKER_BACKEND='redis' BROKER_URL='redis://localhost:6379/1' CELERY_RESULT_BACKEND='redis://localhost:6379/2'
六、在...\testdj\testdj\course下新建tasks.py文件
# -*- coding: utf-8 -*- ''' Created on 2019年8月28日 @author: lenovo ''' import time from celery.task import Task class CourseTask(Task): name='course-task' #給該任務起一個名字,這樣能夠用它在其餘地方表示這個任務 def run(self,*args,**kwargs): print 'start course task' time.sleep(4) print 'args={},kwargs={}'.format(args, kwargs) print 'end course task'
七、新建views.py
# -*- coding: utf-8 -*- ''' Created on 2019年8月29日 @author: lenovo ''' from course.tasks import CourseTask from django.http import JsonResponse def do(request): #執行異步任務 print 'start do request' CourseTask.delay() print 'end do request' return JsonResponse({'result':'ok'})
八、修改urls.py文件:
from django.conf.urls import url from django.contrib import admin from course import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^do/$',views.do,name='do'), ]
九、啓動worker:在manage.py文件所在路徑下執行命令python manage.py celery worker -l INFO
十、打開瀏覽器訪問http://127.0.0.1:8000/do/完成請求發送,查看runserver啓動的服務日誌顯示經過views.py已發送任務成功,查看worker日誌顯示worker已接收到任務並進行了消費
而且咱們發起請求時,
start do request
end do request
是實時打印的(而非等待4S纔打印end do request),說明任務未出現阻塞狀況,證實任務是異步的。
十一、增長定時任務設置:修改celeryconfig.py文件,增長定時任務,並指定定時任務運行在beat_tasks隊列中:
# -*- coding: utf-8 -*- ''' Created on 2019年8月28日 @author: lenovo ''' import celery import djcelery #當djcelery.setup_loader()運行時,Celery便會去查看INSTALLD_APPS下包含的全部app目錄中的tasks.py文件,找到標記爲task的方法,將它們註冊爲celery task。 djcelery.setup_loader() #設置不一樣的隊列,不要只使用默認的隊列,這樣當任務比較多的時候任務之間會相互影響(例如將普通任務和定時任務混在一塊兒), 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' #設置默認隊列,若不指定隊列則使用該隊列 CELERY_IMPORTS=( 'course.tasks', ) #參數配置可參考官網:http://docs.celeryproject.org/en/latest/userguide/configuration.html CELERY_ACKS_LATE=True #容許重試 CELERYD_FORCE_EXECV=True #可讓Celery更加可靠,只有當worker執行完任務後,纔會告訴MQ,消息被消費,防治死鎖 CELERYD_CONCURRENCY=4 #設置併發的worker數量 CELERYD_MAX_TASKS_PRE_CHILD=100 #每一個worker最多執行100個任務被銷燬,能夠防止內存泄露 CELERYD_TASK_TIME_LIMIT=12*30 #單個任務的最大運行時間爲6分鐘,超過的話就被殺掉 #設置定時任務 from datetime import timedelta CELERYBEAT_SCHEDULE={ 'task1':{ 'task':'course-task', 'schedule':timedelta(seconds=5), 'options':{ 'queue':'beat_tasks' } } }
十二、啓動beat:執行命令python manage.py celery beat -l INFO
1三、查看beat日誌定時任務發送狀況以及worker日誌任務消費狀況,當前定時任務跑在beat_tasks隊列里正常
beat日誌顯示按照定時任務設置要求每隔5s發送一次任務:
worker日誌顯示worker成功消費了每一個定時任務: