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 ...
随机推荐
- linux桌面系统 镜像下载
1.Ubuntu 官方下载地址(不推荐,网速较慢):https://www.ubuntu.com/download 阿里云:http://mirrors.aliyun.com/ubuntu-relea ...
- msf自动连接postgresql配置
今天做了一下msf连接数据库的配置,中间碰到了一些坑点这里就不详细叙述了,开始正确的操作方式. 首先对postgresql进行配置以方便连接. root@kali:~# service postgre ...
- P1037 在霍格沃茨找零钱
转跳点:
- DNS原理和智能DNS及CDN
CDN是什么 CDN(Content Delivery Network)是内容分发网络. 作用: 使用户可以就近取的所需要的内容,加速用户访问网站资源的速度.物理距离更近,响应速度更快.拦截部分网络请 ...
- jsp与spring mvc后台controller间参数传递处理之总结
在编程过程中,最容易出现问题及卡壳的地方,往往是各层之间接缝处,接缝处往往存在着各种各样的参数传递,数据转换和格式化,参数很好的传递并正确接收过来之后就是复杂逻辑之间的处理了,所以为了避免多种问题占用 ...
- Angular 学习1
AngularJS 表达式 AngularJS 使用 表达式 把数据绑定到 HTML. AngularJS 表达式 AngularJS 表达式 很像 JavaScript 表达式:它们可以包含文字.运 ...
- C++ 把数组的元素乘以2在输出
#include<iostream> using namespace std; int main(){ ] = { , , , , }; ; ; i < ; i++) { ) { s ...
- MacType
#前言 这几天实在是嫌弃Win10垃圾的字体渲染效果--发虚模糊,索性从网上找了个系统字体渲染软件即MacType给系统字体改头换面. #使用效果 这里贴出两个场景的效果对比(单击图片查看具体效果) ...
- JAXB工具
在JDK6之后,都自带了JAXB工具,所以在jdk类库与tomcat WEBAPP类库之间,会造成冲突 https://blog.csdn.net/iteye_13776/article/detail ...
- windows自带的颜色编辑器居中
void xxx::SetOSDColor(CLabelUI * pLabel) { COLORREF color = RGB(*, *, *); CColorDialog cdlg(color, C ...