Python—在Django中使用Celery
一.Django中的请求
Django Web中从一个http请求发起,到获得响应返回html页面的流程大致如下:
http请求发起
经过中间件
http handling(request解析)
url mapping(url匹配找到对应的View)
在View中进行逻辑(包括调用Model类进行数据库的增删改查)
经过中间件
返回对应的template/response。
同步请求:所有逻辑处理、数据计算任务在View中处理完毕后返回response。在View处理任务时用户处于等待状态,直到页面返回结果。
异步请求:View中先返回response,再在后台处理任务。用户无需等待,可以继续浏览网站。当任务处理完成时,我们可以再告知用户。
二.Django中使用Celery
安装
pip3 install django-celery
配置
首先创建一个django项目,结构如下:

之后再settings.py的同级目录添加celeryconfig.py配置文件,更多配置信息可以参考官方文档。
import djcelery
from datetime import timedelta djcelery.setup_loader() # 导入任务
CELERY_IMPORTS = [
'celeryapp.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 # 设置并发数量
CELERYD_CONCURRENCY = 4 # 每个worker最多执行100个任务,防止泄露内存
CELERYD_MAX_TASKS_PER_CHILD = 100 # 单个任务最多执行时间
CELERYD_TASK_TIME_LIMIT = 12 * 30 # 设置定时执行
CELERYBAET_SCHEDULE = {
'task1': {
'task': 'course-task',
'schedule': timedelta(seconds=5),
'options': {
'queue': 'beat_tasks'
}
}
} CELERY_ACCEPT_CONTENT = ['pickle', 'json', ] BROKER_BACKEND = 'redis'
BROKER_URL = 'redis://localhost:6379/1'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/2'
celeryconfig.py
from .celeryconfig import * # 导入Celery配置信息 INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'celeryapp.apps.CeleryappConfig',
'djcelery' # 注册celery
]
settings.py
import time
from celery.task import Task class Course(Task):
name = 'course-task' def run(self, *args, **kwargs):
print('start...')
time.sleep(3)
print(f'args={args},kwargs={kwargs}')
print('end task....')
tasks.py
from django.http import JsonResponse
from celeryapp.tasks import Course def course(request, *args, **kwargs):
# 执行异步任务
print("start course...")
# Course.delay()
# 可以使用apply_async传递参数,指定队列
Course.apply_async(args=('hello',), queue='work_queue')
print("end course...")
return JsonResponse({'result': 'ok'})
views.py
from django.contrib import admin
from django.urls import path
from celeryapp.views import course urlpatterns = [
path('admin/', admin.site.urls),
path('course/', course),
]
urls.py
启动redis作为消息中间人
启动django项目,然后访问http://localhost:8000/course/,触发任务
python manage.py runserver
启动worker
python manage.py celery worker -l info
可以看到配置情况,以及任务的执行情况:



启动beat
python manage.py celery beat -l info
三.常见错误
♦ AttributeError: ‘str’ object has no attribute ‘items’

解决方法: redis版本过高,降低redis版本即可
pip install redis==2.10.6
♦ from kombu.async.timer import Entry, Timer as Schedule, to_timestamp, logger SyntaxError: invalid syntax

这个是python3.7目前不支持kombu,降低python版本至3.6即可,可以使用conda进行直接安装
conda install python=3.6.8
四.过程监控
Celery提供了一个工具flower,将各个任务的执行情况、各个worker的健康状态进行监控并以可视化的方式展现。
安装监控
pip install flower
执行flower
python manage.py celery flower
本地端口:5555查看监控

刷新course页面,查看tasks,发现有刚刚执行完成的任务

查看broker

进入Monitor查看任务执行情况,执行成功,执行失败,消耗的时间,队列里面的任务情况
点击的worker查看具体worker情况

可以给flower添加密码认证,添加之后再访问则需要输入用户名和密码
python manage.py celery flower --basic_auth=username:password
Python—在Django中使用Celery的更多相关文章
- Django 中使用 Celery
起步 在 <分布式任务队列Celery使用说明> 中介绍了在 Python 中使用 Celery 来实验异步任务和定时任务功能.本文介绍如何在 Django 中使用 Celery. 安装 ...
- Django中使用Celery实现定时任务(用djcelery)
一.引言 Django是python语言下的一个比较热门的Web框架,越来越多的企业和开发者使用Django实现自己的Web服务器.在Web服务器开发过程中,有时候我们不仅仅是要实现Web服务器端和用 ...
- celery介绍、架构、快速使用、包结构,celery执行异步、延迟、定时任务,django中使用celery,定时更新首页轮播图效果实现,数据加入redis缓存的坑及解决
今日内容概要 celery介绍,架构 celery 快速使用 celery包结构 celery执行异步任务 celery执行延迟任务 celery执行定时任务 django中使用celery 定时更新 ...
- Django中使用Celery
一.前言 Celery是一个基于python开发的分布式任务队列,如果不了解请阅读笔者上一篇博文Celery入门与进阶,而做python WEB开发最为流行的框架莫属Django,但是Django的请 ...
- python框架django中结合vue进行前后端分离
一:创建django项目 1.django-admin startproject mysite # 创建mysite项目 2.django-admin startapp app01# 创建app01应 ...
- Celery简介以及Django中使用celery
目录 Celery简介 消息中间件 任务执行单元 任务结果存储 使用场景 Celery的安装和配置 Celery执行异步任务 基本使用 延时任务 定时任务 异步处理Django任务 案例: Celer ...
- python框架Django中MTV之Model(数据模型)
MTV框架之Model(数据模型) 关注公众号"轻松学编程"了解更多. 1.连接MySQL数据库 项目中的settings.py设置范例 # 配置数据库 DATABASES = { ...
- Django中使用Celery,定制应用程序中定义的shared_task未在定期任务管理页面的注册任务中显示
解决办法: 在项目 proj/proj/celery.py文件中,看到下面这行配置: celery_app.config_from_object('django.conf:settings', nam ...
- python框架Django中MTV框架之VIew(业务控制器)
MTV框架之VIew(业务控制器) 关注公众号"轻松学编程"了解更多. 1.什么是视图 视图层=路由表(urls.py)+视图函数(views.py) 其角色相当于MVC中的Con ...
随机推荐
- python用于web题里写解密脚本
题源自bugku里的WEB3 选择选项让他停止,F12后出现如下代码,一看数字就知道是ASC: 复制出来,写pyhton脚本如下,在编译器里跑一下 s='KEY{J2sa42ahJK-HS11III} ...
- Codeforces Round #611 (Div. 3)
原题面:https://codeforces.com/contest/1283 A.Minutes Before the New Year 题目大意:给定时间,问距离零点零分还有多久? 分析:注意一下 ...
- 全选checkbox只能执行一次的问题
现象:第一次运行,点select all那个checkbox,可以全选,再点一次,也可以全部取消.但是,之后不管怎样点击,都没有用了…… <input type="checkbox&q ...
- Sublime Text3 python自动补全问题——Sublime Text3安装Anaconda插件
学习python的时候 在编辑器的选择上会有很多选择,我最终还是选择了sublime text3. 相对于其他编辑器,sublime text有以下特性: 插件多,类似GoSublime,Emmet信 ...
- 杂记 -- 关于ref、kepp-alive、nextTick、fetch
1.ref:定义一个普通的dom节点或一个vue的组件实例对象 定义方法: <div class="page1"> <button @click="li ...
- mencoder及ffmpeg的基本命令
前段时间想在ubuntu下对视频进行格式转换,多方查找之后,接触了mencoder与ffmpeg. mencoder mencoder 是一款命令行方式的视频处理软件,是Mplayer自带的编码工具, ...
- Java基础之内省
Java基础之内省 什么是内省 首先,我们要知道什么是内省.按我自己的理解就是在反射的原理上进行封装,来更方便的操作JavaBean JavaBean就是特殊格式的类,其规范为: JavaBean ...
- python --- request返回值乱码问题
1.分析 a)<HTTP权威指南>里第16章国际化里提到,如果HTTP响应中Content-Type字段没有指定charset,则默认页面是'ISO-8859-1'编码.一般现在页面编码都 ...
- ZOJ - 3123 Subsequence (滑动窗口)
题意:给定N个数,求和大于等于S的最短连续子序列的长度. 分析:滑动窗口即可.两种写法. 1. #include<cstdio> #include<cstring> #incl ...
- DuplicateHandle 伪句柄 与 实句柄的应用
如果把GetCurrentThread()返回值传递给一个HANDLE句柄,用它进行ResumeThread,结果肯定不是我们想要的.下面的例子详细描述了伪句柄的调用结果: #include &quo ...
