Django + Celery
2019-04-25 本文已影响0人
爱修仙的道友
一、安装及使用
- Install: pip install django-celery
- Worker: python manage.py celery worker -Q queue
目录结构
image.png二、setting.py 引入配置
INSTALLED_APPS = [
...
'djcelery',
]
# celery配置
from .celeryconfig import *
BROKER_BACKEND = 'redis'
BROKER_URL = 'redis://localhost:6379/1'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/2'
三、celery相关配置
# celeryconfig.py
import djcelery
from datetime import timedelta
djcelery.setup_loader()
# 设置队列
CELERY_QUEUES = {
# 定时任务队列
'beat_queue':{
'exchange':'beat_queue',
'exchange_type':'direct',
'binding_key':'beat_queue'
},
# 耗时任务队列
'work_queue':{
'exchange':'work_queue',
'exchange_type':'direct',
'binding_key':'work_queue'
}
}
# 设置默认任务队列
CELERY_DEFAULT_QUEUE = 'work_queue'
CELERY_IMPORTS = (
'course.tasks',
)
# 有些情况可以防止死锁
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':'course-task',
'schedule':timedelta(seconds=5),
# 指定队列
'options':{
'queue':'beat_queue',
}
}
}
在相关app目录下编写 tasks.py 文件
from .tasks import CourseTask
from django.http import JsonResponse
def func(request):
# 执行异步任务
print('start do request')
course_task = CourseTask()
course_task.delay()
# 在函数中指定队列
course_task.apply_async(args=('hello',),queue='beat_queue')
print('end do request')
return JsonResponse({'result':'ok'})
views.py 引入
from .tasks import CourseTask
from django.http import JsonResponse
def func(request):
# 执行异步任务
print('start do request')
CourseTask.delay()
# 在函数中指定队列
CourseTask.apply_async(args=('hello',),queue='beat_queue')
print('end do request')
return JsonResponse({'result':'ok'})
urls.py
from django.urls import path
from .views import func
urlpatterns = [
path('func/', func, name='func' ),
]
开启worker 和beat
python manage.py celery worker -l INFO
python manage.py celery beat -l INFO
展示
现在发送请求就可以使用定时任务和异步任务了 0.0