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 ...
随机推荐
- Problem J. Joseph’s Problem 约瑟夫问题--余数之和
链接:https://vjudge.net/problem/UVA-1363 题意:给出n k,当 i 属于 1~n 时 ,求解 n% i 的和 n 和 k 的范围都是 1 到 10^9; 商相同 ...
- 08 MySQL存储引擎
查询当前默认存储引擎 SHOW VARIABLES LIKE 'table_type' ; 查询当前数据库支持的引擎有哪些 : SHOW ENGINES \G -- 推荐 ...
- 软件管理-RPM命令管理:安装升级与卸载
1.包名与包全名 包名 : 操作已经安装的软件包时,使用包名:系统会搜索var/lib/rpm中的数据库 包全名: 操作的包时没有安装的软件包时,使用包全名,而且注意路径 2.RPM安装 切换到光盘p ...
- Jmeter安装插件Stepping Thread Group
下载链接:https://jmeter-plugins.org/downloads/old/ 下载解压后,将JMeterPlugins-Standard.jar包放在jmeter安装目录的jmeter ...
- xargs详细
转自 http://czmmiao.iteye.com/blog/1949225 简介之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命 ...
- oracle开机启动
第一步 修改oratab (root用户执行) /etc/oratab的配置格式如下: $ORACLE_SID:$ORACLE_HOME:Y 例如:orclqdgw:/var/app/oracle/p ...
- Centos6 import tensorflow遇到的问题
1.ImportError: /lib64/libc.so.6: version `GLIBC_2.16' not found 解决办法:升级系统glibc库至2.17版本 首先在网上下载glibc- ...
- springboot#filter
_ Filter不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链.完 ...
- 无法启动APK安装也,报异常FileUriExposedException
无法打开APK安装页,报异常FileUriExposedException, https://juejin.im/entry/58e4643db123db15eb79a902
- Python MongoDB 插入文档
章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...
