django中配置使用celery

環境版本: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成功消費了每一個定時任務:

 

相關文章
相關標籤/搜索