1.Celery介绍

1.1 celery应⽤举例

  • Celery 是⼀个 基于python开发的 分布式异步消息任务队列 ,通过它可以轻松的实现任务的异步处
    理,如果你的业务场景中需要⽤到异步任务,就可以考虑使⽤celery
  • 你想对100台机器执⾏⼀条批量命令,可能会花很⻓时间 ,但你不想让你的程序等着结果返回,⽽
    是给你返回 ⼀个任务ID,你过⼀段时间只需要拿着这个任务id就可以拿到任务执⾏结果, 在任务执
    ⾏ing进⾏时,你可以继续做其它的事情
  • Celery 在执⾏任务时需要通过⼀个消息中间件来接收和发送任务消息,以及存储任务结果, ⼀般
    使⽤rabbitMQ or Redis

1.2 Celery有以下优点

  • 简单:⼀单熟悉了celery的⼯作流程后,配置和使⽤还是⽐较简单的
  • ⾼可⽤:当任务执⾏失败或执⾏过程中发⽣连接中断,celery 会⾃动尝试重新执⾏任务
  • 快速:⼀个单进程的celery每分钟可处理上百万个任务
  • 灵活: ⼏乎celery的各个组件都可以被扩展及⾃定制

1.3 Celery 特性

  • ⽅便查看定时任务的执⾏情况, 如 是否成功, 当前状态, 执⾏任务花费的时间等
  • 可选 多进程, Eventlet 和 Gevent 三种模型并发执⾏.
  • Celery 是语⾔⽆关的.它提供了python 等常⻅语⾔的接⼝⽀持.

2.celery 组件

2.1 Celery 扮演⽣产者和消费者的角色

  • Celery Beat : 任务调度器. Beat 进程会读取配置⽂件的内容, 周期性的将配置中到期需要执⾏的任
    务发送给任务队列.
  • Celery Worker : 执⾏任务的消费者, 通常会在多台服务器运⾏多个消费者, 提⾼运⾏效率.
  • Broker : 消息代理, 队列本身. 也称为消息中间件. 接受任务⽣产者发送过来的任务消息, 存进队列
    再按序分发给任务消费⽅(通常是消息队列或者数据库).
  • Producer : 任务⽣产者. 调⽤ Celery API , 函数或者装饰器, ⽽产⽣任务并交给任务队列处理的都
    是任务⽣产者.
  • Result Backend : 任务处理完成之后保存状态信息和结果, 以供查询.

2.2 产生任务的方式

  • 发布者发布任务(WEB 应⽤)
  • 任务调度按期发布任务(定时任务)

2.3 celery 依赖三个库: 这三个库, 都由 Celery 的开发者开发和维护.

  • billiard : 基于 Python2.7 的 multisuprocessing ⽽改进的库, 主要⽤来提⾼性能和稳定性.
  • librabbitmp : C 语⾔实现的 Python 客户端
  • kombu : Celery ⾃带的⽤来收发消息的库, 提供了符合 Python 语⾔习惯的, 使⽤ AMQP 协议的⾼
    级借⼝

3、celery的使用

推荐版本

Django == 2.2.6
django-celery == 3.3.1
django-redis == 4.11.0
redis == 2.10.6
celery == 3.1.26.post2

  • Settings.py
#settings.py
import djcelery
djcelery.setup_loader()
BROKER_URL = 'redis://127.0.0.1:6379/2'
INSTALLED_APPS = [..."djcelery",...
]
  • 创建celery所需要的表
python manage.py migrate
#如若不成功可以尝试⼀下命令语句
# python manage.py syncdb
  • 创建task
    在app⾥建⽴tasks.py⽂件来写⼊需要执⾏的异步任务
###############verificationsapp/tasks.py########
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
from code2001B.settings import ALY_ACCESSKEY_ID,ALY_ACCESSKEY_SECRET
import json,time
from celery import task
@task
def send_sms(phone,data):# client = AcsClient(ALY_ACCESSKEY_ID, ALY_ACCESSKEY_SECRET, 'cnhangzhou')## #data ={ "code" : 123456 }## request = CommonRequest()# request.set_accept_format('json')# request.set_domain('dysmsapi.aliyuncs.com')# request.set_method('POST')# request.set_protocol_type('https') # https | http# request.set_version('2017-05-25')# request.set_action_name('SendSms')## request.add_query_param('RegionId', "cn-hangzhou")# request.add_query_param('PhoneNumbers', phone)# request.add_query_param('SignName', "天天商城")# request.add_query_param('TemplateCode', "SMS_185212884")# request.add_query_param('TemplateParam', data)# response1 = client.do_action(request)# # python2: print(response)# res = json.loads(str(response1, encoding='utf-8'))time.sleep(5)return 5+10

a、当settings.py中的djcelery.setup_loader()运⾏时, Celery便会查看所有INSTALLED_APPS中app
⽬录中的tasks.py⽂件, 找到标记为task的function, 并将它们注册为celery task.

b、在执⾏djcelery.setup_loader()时, task是以INSTALLED_APPS中的app名,
加.tasks.function_name注册的

c、⼀次需要注意 在impprt task时, 需要保持⼀致

d、如果我们由于python path不同⽽使⽤不同的引⽤⽅式时(例如在tasks.py中使⽤from
myproject.myapp.tasks import add形式), Celery将⽆法得知这是同⼀task, 因此可能会引起奇怪的
bug。

  • views.py⾥让任务异步执⾏
from rest_framework.views import APIView
from rest_framework.response import Response
from libs.captcha.captcha import captcha
from django.http.response import HttpResponse
import random
from verificationsapp.tasks import send_sms
from django_redis import get_redis_connectionclass SendSMSCode(APIView):def post(self,request):phone = request.data.get("phone")image_code = request.data.get("image_code")image_code_uuid = request.data.get("image_code_uuid")print(phone)print(image_code_uuid)print(image_code)if not all([phone,image_code,image_code_uuid]):return Response({"code":4005,"msg":"参数不全"})#先获取redis ⾥的图⽚验证码来⽐对redis_cli = get_redis_connection("img_code")redis_img_code = redis_cli.get(image_code_uuid).decode()print(redis_img_code)print(image_code)if image_code.lower() != redis_img_code.lower():return Response({"code":4003,"msg":"参数错误"})# 发送短信num = random.randint(100000,999999)print(num)send_data = {"code":10086}send_sms.delay(phone,send_data)# pipeline管道:作⽤就是把多个命令放在⼀起来执⾏pl = redis_cli.pipeline()pl.setex(phone,60*5,num)pl.delete(image_code_uuid)pl.execute()return Response({"code":0,"msg":"发送成功"})
  • 启动celery
    ⾸先正常启动你的django任务,然后启动celery服务即可。
python manage.py celery worker --loglevel=info

如果报错不让超级管理员来启动,在settings.py加⼊以下配置

from celery import Celery, platforms
platforms.C_FORCE_ROOT = True

Django - Celery使用及介绍相关推荐

  1. django - celery

    django - celery 的集成开发 celery 特点 celery 简单.灵活.可靠的分布式系统 处理异步任务队列 支持任务调度 celery 的组成 消息中间件 任务执行单元 worker ...

  2. django celery 异步发送邮箱

    django + celery + redis 异步发送QQ邮箱 django一般的代码逻辑都需要一步一步执行,这样大大的占用了I/O资源,用户也得不到完美的体验,django-celery可以灵活的 ...

  3. Django + Celery 实现周期任务

    1:Celery简介 1.1 异步任务,假设用户发起一个request,并等待request返回.但是在request 经过django一层层处理到达我们的view时,view要进行一次比较耗时的操作 ...

  4. celery 可视化_Django中Celery的实现介绍(一)

    Django中Celery的实现 Celery介绍 Celery是基于Python开发的一个分布式任务队列框架,支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度. 上图展示的是Celery ...

  5. python 分布式框架_Python 并行分布式框架:Celery 超详细介绍

    本博客摘自:http://blog.csdn.net/liuxiaochen123/article/details/47981111 先来一张图,这是在网上最多的一张Celery的图了,确实描述的非常 ...

  6. 【Web系列二十】Django+Celery+Asgiref+Channels+协程锁实现Websocket异步并发

    写在前面 最近手头有一个项目需要交付,作为web项目,并发问题是不可避免的.对于Django后端,常用的并发实现方案就是Celery,虽然网上已经有不少实施例,但是实际开发过程中遇到一些问题.比如长连 ...

  7. Python 并行分布式框架:Celery 超详细介绍

    先来一张图,这是在网上最多的一张Celery的图了,确实描述的非常好 Celery的架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(tas ...

  8. Django Celery定时任务和时间设置

    1.Celery加入定时任务 Celery除了可以异步执行任务之外,还可以定时执行任务.在实例代码的基础上写个测试方法: 1 #coding:utf-8 2 from celery.task.sche ...

  9. django celery

    基本步骤 安装 install redis yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm yum ...

最新文章

  1. CI类实现session基本用法
  2. mysql将行显示成列_mysql – 在表中将行显示为列
  3. 让QT对话框显示中文
  4. 分布式事务处理学习报告
  5. 关于安装centOS精简版ifconfig无效的问题
  6. Android studio 真机调试出现sdk版本不匹配问题
  7. 安卓pdf阅读器_PDF阅读用哪款软件好?推荐这7款,简单又好用!
  8. 初学者都能看懂的蒙特卡洛方法以及python实现
  9. 两条边延长角会有什么变化_四年级上册数学计划
  10. Scriptcase Crack,PHP Web 开发工具
  11. ST7920 12864液晶图片取模,显示你想显示的图片。
  12. windows如何导出组策略结果集 (RSOP)
  13. C语言实现植物大战僵尸----学习过程
  14. 论语之宪问第十四、卫灵公第十五、季氏第十六
  15. 网络摄像头Rtsp直播方案(一)
  16. c语言十全十美游戏规则,十全十美游戏
  17. document.documentElement与document.body
  18. 2018信用服务业市场:天眼查、企查查、启信宝、企查猫处第一梯队
  19. sfr是什么意思通俗易懂讲解
  20. java用scanner循环输入_Scanner怎么实现连续输入

热门文章

  1. 快应用是什么软件?快应用有什么用?
  2. tomcat9.0安装及配置教程_Apache Tomcat 安装与配置教程
  3. SuperMap iDesktopX安装 ---(保密机:龙芯CPU+银河麒麟系统)
  4. Excel提取重复项
  5. Java面向对象实验 8 ——图形用户界面设计
  6. 新司机的黑裙战斗机 篇四:新司机的黑群晖指北—软件篇(下)
  7. 700多页A4纸打印要多少钱?
  8. 陌生人邀请我加入CS:GO游戏,我一接受就被盗号了
  9. python listdir 忽略 隐藏文件_忽略特殊文件
  10. 【校招内推】字节跳动2022提前批开启