路飞学城5-celery

news/2025/3/10 0:26:22/文章来源:https://www.cnblogs.com/machangwei-8/p/18694750

 

Celery

Celery是一个功能完备即插即用的异步任务队列系统。它适用于异步处理问题,当发送邮件、或者文件上传, 图像处理等等一些比较耗时的操作,我们可将其异步执行,这样用户不需要等待很久,提高用户体验。

文档:http://docs.jinkan.org/docs/celery/getting-started/index.html

Celery的特点是:

  • 简单,易于使用和维护,有丰富的文档。

  • 高效,单个celery进程每分钟可以处理数百万个任务。

  • 灵活,celery中几乎每个部分都可以自定义扩展。

 

任务队列是一种跨线程、跨机器工作的一种机制.
任务队列中包含称作任务的工作单元。有专门的工作进程持续不断的监视任务队列,并从中获得新的任务并处理.
celery通过消息进行通信,通常使用一个叫Broker(中间人)来协client(任务的发出者)和worker(任务的处理者). clients发出消息到队列中,broker将队列中的信息派发给worker来处理。

 

 

Celery的架构

Celery的架构由三部分组成,消息队列(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成。

 

 

一个celery系统可以包含很多的worker和broker

Celery本身不提供消息队列功能,但是可以很方便地和第三方提供的消息中间件进行集成,包括RabbitMQ,Redis,MongoDB等

安装

pip install -U celery  #-U是update的意思,有就进行更新,没有就安装
#后面单独将celery运行起来就可以了

也可从官方直接下载安装包:https://pypi.python.org/pypi/celery/

tar xvfz celery-0.0.0.tar.gz
cd celery-0.0.0
python setup.py
python setup.py install

使用

使用celery第一件要做的最为重要的事情是需要先创建一个Celery实例,我们一般叫做celery应用,或者更简单直接叫做一个app。app应用是我们使用celery所有功能的入口,比如创建任务,管理任务等,在使用celery的时候,app必须能够被其他的模块导入。

一般celery任务目录直接放在项目的根目录下即可,路径:

luffyapi/
├── mycelery/
   ├── config.py     # 配置文件
   ├── __init__.py  
   ├── main.py       # 主程序
   └── sms/          # 一个目录可以放置多个任务,该目录下存放当前任务执行时需要的模块或依赖,也可以每个任务单独一个目录
       └── tasks.py  # 任务的文件,名称必须是这个!!!

 

main.py,代码:

# 主程序
from celery import Celery
# 创建celery实例对象
app = Celery("luffy")

# 通过app对象加载配置,文件路径
app.config_from_object("mycelery.config")

# 自动搜索并加载任务
# 参数必须必须是一个列表,里面的每一个任务都是任务的路径名称
# app.autodiscover_tasks(["任务1","任务2"])
app.autodiscover_tasks(["mycelery.sms","mycelery.email"]) #会自动识别sms目录下面的tasks.py文件中的任务,所以不需写成mycelery.sms.tasks

# 启动Celery的命令
# 强烈建议切换目录到项目的根目录下启动celery!!
# celery -A mycelerymain worker --loglevel=info

配置文件config.py,代码:(文件形式,json形式,对象形式都行)

# 任务队列的链接地址(变量名必须叫这个)
broker_url = 'redis://127.0.0.1:6379/14'  
# 结果队列的链接地址(变量名必须叫这个)
result_backend = 'redis://127.0.0.1:6379/15'

 

创建一个任务文件sms/tasks.py,并创建任务,代码:

# celery的任务必须写在tasks.py的文件中,别的文件名称不识别!!!
from mycelery.main import app

@app.task(name="send_sms")  # name表示设置任务的名称,如果不填写,则默认使用函数名(路径)做为任务名
def send_sms():
   print("发送短信!!!")

@app.task  # name表示设置任务的名称,如果不填写,则默认使用函数名做为任务名
def send_sms2():
   print("发送短信任务2!!!")

 

接下来,我们运行celery,在终端,项目根目录下(也就是mycelery的外层目录里面)执行指令

celery -A mycelery.main worker --loglevel=info (或者直接写info也行) #-A是指定celery启动入口

 

效果如下:

 

 

- ** ---------- [config]
- ** ---------- .> app:         __main__:0x10b24ba50
- ** ---------- .> transport:   redis://127.0.0.1:6379/14
- ** ---------- .> results:     redis://127.0.0.1:6379/15
- *** --- * --- .> concurrency: 16 (prefork)  #表示它开启了16个线程准备来来执行任务,可以在后面执行任务的时候自行测试一下,一共可以有16个任务同时执行
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker) #有没有开启其他的事件(比如事件监听等等一些东西)

 

运行起来之后,如果又添加了新的任务,需要重新启动celery。

然后执行任务,可以在mycelery下面创建一个py文件进行测试,名字随便起,比如叫做runtask.py文件,内容如下

#引入任务
from mycelery.sms.tasks import send_sms  
#执行任务
send_sms.delay() #这就是将任务交给worker去执行了,这个任务在上面的时候已经加到队列中了,所以调用它的意思就是让worker去队列中找到send_sms这个任务去执行
#然后运行我们这个文件,右键运行就行,celery会在后台一直运行着

去redis中查看,就能看到任务执行结果了

如果想获取任务结果可以通过get方法,或者AsyncResult这个类来拿

方式1:
import time
from mycelery.sms.tasks import send_sms
from mycelery.mail.tasks import send_emailret = send_sms.delay()
print(ret,type(ret))
print(ret.ready())
print(ret.id)
# time.sleep(3)
print(ret.ready())
print(ret.get(timeout=1),)方式2
import time
from mycelery.sms.tasks import send_sms
from mycelery.mail.tasks import send_emailfrom celery.result import AsyncResult
ret = send_sms.delay()  #执行的任务如果需要参数,那么就直接在delay方法里面写:send_sms(mobile,sms_code),执行时:delay(mobile,sms_code)
async_task = AsyncResult(id=ret.id,app=send_sms)print(async_task.successful())
result = async_task.get()
print(result)

celery还有很多可配置的项,还可以拓展很多的方法,并且还能完成定时任务:定时备份数据库,定时分析日志文件等。关于这些,还是建议大家学习一下。

 

其他参考文档:

http://docs.celeryproject.org/en/latest/getting-started/introduction.html

https://github.com/celery/celery/tree/master/examples/django/

https://www.jianshu.com/p/1840035cb510

https://flower.readthedocs.io/en/latest/screenshots.html

 

接下来,我们需要把celery和django组合起来一起使用。

 

把django和celery进行组合

在main.py主程序中对django的配置文件进行加载

# 主程序
import os
from celery import Celery
# 创建celery实例对象
app = Celery("luffy") #celery对象可以创建多个,所以我们最好给我们当前的celery应用起个名字,比如叫做luffy# 把celery和django进行组合,需要识别和加载django的配置文件
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffyapi.settings.dev')
#如果只是使用了logging日志功能的话可以不写以下两句,因为logging是python提供的模块,但是将来可能使用celery来执行其他的django任务,所以我们先写上
import django
django.setup()# 通过app对象加载配置
app.config_from_object("mycelery.config")# 加载任务
# 参数必须必须是一个列表,里面的每一个任务都是任务的路径名称
# app.autodiscover_tasks(["任务1","任务2"])
app.autodiscover_tasks(["mycelery.sms","mycelery.mail"])# 启动Celery的命令
# 切换目录到mycelery根目录下启动
# celery -A mycelery.main worker --loglevel=info

在需要使用django配置的任务中,直接加载配置,所以我们把注册的短信发送功能,整合成一个任务函数,代码:

from mycelery.main import app
from lyapi.libs.yuntengxun.send_sms import send_message@app.task(name='send_sms')
def send_sms(code, phone):ret = send_message(code, phone)return ret

 

在这个任务中,我们需要加载短信发送的sdk和相关的配置常量,所以我们可以直接把django中的短信发送模块和相关的常量配置文件直接剪切到当前sms任务目录中

mycelery/
├── config.py
├── __init__.py
├── main.py
└── sms/├── __init__.py├── tasks.py

再次启动项目即可。

 

最终在django里面,我们调用Celery来异步执行任务。需要完成2个步骤:

# 1. 声明一个和celery一模一样的任务函数,但是我们可以导包来解决
from mycelery.sms.tasks import send_sms# 2. 调用任务函数,发布任务
send_sms.delay(code, phone)
# send_sms.delay() 如果调用的任务函数没有参数,则不需要填写任何内容
 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/876830.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 安装并使用 EasyConnect

x86_64-linux-gnu下载: 如果你下载之后要登入 https://yzftxdy.com 的话,你就先在浏览器里面输入这个网址,网站会弹出来给你下载的机会如果你的浏览器无法下载,你可以让别人帮你下载 .deb 文件。糖下载完了就 dpkg -i balabala.deb,于是你打开 "show apps"会找到…

[Jest] 测试快照

在对组件进行测试的时候,往往需要从两个方面进行测试:交互:确保组件在进行交互时功能正常 渲染:确保组件渲染输出正确(比如不会多一个或者少一个 DOM 元素)针对渲染方面的测试,我们就可以使用快照来进行测试。 所谓快照,就是给渲染出来的 DOM 元素拍一张“照片”(将最…

[React Jest] 测试 Hook

在进行 React 开发的时候,还有一个非常重要的功能模块,那就是 Hook,自定义 Hook 作为一块公共逻辑的抽离,也会像组件一样被用到多个地方,因此对 Hook 的测试也是非常有必要的。 Hook 没有办法像普通函数一样直接进行测试,因为在 React 中规中,Hook 必须要在组件里面使用…

07_LaTeX之绘图功能

除了排版文字,$\LaTeX{}$ 也支持用代码表示图形。不同的扩展已极大丰富了 $\LaTeX{}$ 的图形功能,`TikZ` 就是其中之一。本章将带你了解一些基本的绘图功能。07_\(\LaTeX{}\) 之绘图功能 目录07_\(\LaTeX{}\) 之绘图功能绘图语言简介\(\textrm{TikZ}\) 绘图语言\(\textrm{Tik…

《计算机网络》笔记——第四章 网络层

目录第4章 网络层网络层提供的两种服务网际协议IP虚拟互连网络分类的IP地址IP地址与硬件地址地址解析协议ARPIP数据报的格式IP层转发分组的流程划分子网和构造超网划分子网无分类编址CIDR(构造超网)最长前缀匹配网际控制报文协议ICMPICMP的应用互联网的路由选择协议 第4章 网络…

《计算机网络》笔记——第三章 数据链路层

计算机网络(第7版)谢希仁目录第3章 数据链路层使用点对点信道的数据链路层三个基本问题(1) 封装成帧(2) 透明传输(3) 差错检测点对点协议PPPPPP协议特点PPP协议的组成PPP协议的帧格式PPP协议的工作状态使用广播信道的数据链路层CSMA/CD协议使用集线器的星形拓扑以太网的信道利…

《计算机网络》笔记——第一章 概述

计算机网络(第7版)谢希仁目录第一章 概述互联网基础结构计算机网络的分类互联网的组成计算机网络的性能计算机网络体系结构TCP/IP的体系结构 第一章 概述 互联网基础结构 互联网服务提供者ISP(Internet Service Provider) 互联网交换点IXP(Internet Exchange Point)计算机…

解析几何笔记

数学 目录数学一、双根式Ex 1Ex 2二、极坐标Ex 1Ex 2三、平移齐次化Ex 1四、同构式Ex 1五、定比点差法Ex 1Ex 2六、极点极线和调和点列 一、双根式 将圆锥曲线和直线联立,展开并做韦达定理是困难的。但是考虑到任意二次方程都可以写成 \(g(x) = a(x_1 - x)(x_2 - x) = 0\) 的形…

线段树总集

引入 一个数列,单点修改(加),区间查询(和)。 上述问题有很多种解法,如树状数组、分块、平衡树等,今天的主题是著名的线段树。 正题 (不确保按难度升序排序,自己看着目录调顺序吧) 线段树基本原理 因为需要区间查询,所以我们希望有一些捷径能将部分的数的和提前算好…

攻防世界reverse难度3

真难做啊攻防世界Reverse3 哎,坐牢,哎,坐牢. 我从来没有觉得ctf有趣过.jpg painful secret-string-400 js虚拟机混淆 我理解错了,一直以为是所有代码翻译一遍. 结果发现是读取字节然后执行代码. 也就是说,它可以直接翻译成ascii码去掉无用的字节码.(还是看wp知道的,看的时候都懵…

线段树总集 1

引入 一个数列,单点修改(加),区间查询(和)。 上述问题有很多种解法,如树状数组、分块、平衡树等,今天的主题是著名的线段树。 正题 (不确保按难度升序排序,自己看着目录调顺序吧) 线段树基本原理 因为需要区间查询,所以我们希望有一些捷径能将部分的数的和提前算好…

央视蛇年春晚Counting Stars中文翻译!

视频链接 : httpe990-5b4b-4262-95d7-7ea2f9425874&modal_id=7464989004501486900&type=general 《Counting Stars》是美国流行摇滚乐队OneRepublic演唱的一首歌曲,由主唱瑞恩泰德创作。这首歌收录于乐队的第三张录音室专辑《Native》中,以其充满活力的旋律和深刻的…