一.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作为消息中间人

redis-server 

启动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的更多相关文章

  1. Django 中使用 Celery

    起步 在 <分布式任务队列Celery使用说明> 中介绍了在 Python 中使用 Celery 来实验异步任务和定时任务功能.本文介绍如何在 Django 中使用 Celery. 安装 ...

  2. Django中使用Celery实现定时任务(用djcelery)

    一.引言 Django是python语言下的一个比较热门的Web框架,越来越多的企业和开发者使用Django实现自己的Web服务器.在Web服务器开发过程中,有时候我们不仅仅是要实现Web服务器端和用 ...

  3. celery介绍、架构、快速使用、包结构,celery执行异步、延迟、定时任务,django中使用celery,定时更新首页轮播图效果实现,数据加入redis缓存的坑及解决

    今日内容概要 celery介绍,架构 celery 快速使用 celery包结构 celery执行异步任务 celery执行延迟任务 celery执行定时任务 django中使用celery 定时更新 ...

  4. Django中使用Celery

    一.前言 Celery是一个基于python开发的分布式任务队列,如果不了解请阅读笔者上一篇博文Celery入门与进阶,而做python WEB开发最为流行的框架莫属Django,但是Django的请 ...

  5. python框架django中结合vue进行前后端分离

    一:创建django项目 1.django-admin startproject mysite # 创建mysite项目 2.django-admin startapp app01# 创建app01应 ...

  6. Celery简介以及Django中使用celery

    目录 Celery简介 消息中间件 任务执行单元 任务结果存储 使用场景 Celery的安装和配置 Celery执行异步任务 基本使用 延时任务 定时任务 异步处理Django任务 案例: Celer ...

  7. python框架Django中MTV之Model(数据模型)

    MTV框架之Model(数据模型) 关注公众号"轻松学编程"了解更多. 1.连接MySQL数据库 项目中的settings.py设置范例 # 配置数据库 DATABASES = { ...

  8. Django中使用Celery,定制应用程序中定义的shared_task未在定期任务管理页面的注册任务中显示

    解决办法: 在项目 proj/proj/celery.py文件中,看到下面这行配置: celery_app.config_from_object('django.conf:settings', nam ...

  9. python框架Django中MTV框架之VIew(业务控制器)

    MTV框架之VIew(业务控制器) 关注公众号"轻松学编程"了解更多. 1.什么是视图 视图层=路由表(urls.py)+视图函数(views.py) 其角色相当于MVC中的Con ...

随机推荐

  1. UVA - 10817 Headmaster's Headache (状压dp+记忆化搜索)

    题意:有M个已聘教师,N个候选老师,S个科目,已知每个老师的雇佣费和可教科目,已聘老师必须雇佣,要求每个科目至少两个老师教的情况下,最少的雇佣费用. 分析: 1.为让雇佣费尽可能少,雇佣的老师应教他所 ...

  2. Fedora Workstation 31众多功能得到改进

    导读 周一,Red Hat的桌面高级经理Christian F.K. Schaller分享了一篇博客文章,概述了Fedora Workstation 31的各种改进和特性.这些包括Wayland的改进 ...

  3. 说说我当初是如何学Linux的

    今天我就说说我当初是如何从一名普通桌面维护工程师,通过学习和努力转成Linux运维工程师的,以及作为Linux运维工程师需要一些什么技能和知识,希望可以帮到一些对Linux有兴趣或者想往Linux这个 ...

  4. jsp采用ajax传递数组给后台controller并遍历

    ajax传递数组,期间出各种各样的问题,那叫一个头疼,网上各种查,都没有解决,最终摸索摸索加借鉴搞定,不多说,上代码 /* 复选框选定部分 */ $("#delete").clic ...

  5. JPA#复杂查询#引子

    _ 震惊....简历上写精通JPA的被下面几个问题震呆了.... 几个问题: 复杂查询如何从前端传递到后端,特别是多个条件的.且具有and和or等复杂逻辑,这个要如何封装呢? 多表查询? 自定义sql ...

  6. React+Flask打造前后端分离项目开发环境

    目录 前言 Backend-Flask Frontend-React Done References 前言 新的一年,开始水第一篇技术文.碰巧最近React玩得多,撸一篇文章纪念一下开发环境的搭建.

  7. 开源DDD设计模式框架YMNNetCoreFrameWork第五篇-Swagger增加权限认证

    配置文件services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Version = " ...

  8. Java中调试与测试常用方法

    一.断言 1.概述 根据之前的条件来对后续的结果进行预判. 2.在Java中,断言默认是不开启的,需要手动进行开启,只需添加参数-ea(enable assert的意思) 开启步骤: 选中项目路径,鼠 ...

  9. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:测试SSH框架分层整合及验证事务是否有效

    测试框架分层的整合 HibernateTemplate 和 HibernateDaoSupport,这两个类是 Spring 为整合 Hibernate3 提供的两个工具类. HibernateTem ...

  10. mock的使用及取消,node模仿本地请求:为了解决前后端分离,用户后台没写完接口的情况下

    借鉴:https://www.jianshu.com/p/dd23a6547114 1.说到这里还有一种是配置node模拟本地请求 (1)node模拟本地请求: 补充一下 [1]首先在根目录下建一个d ...