一、celery简介,架构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 1 celery:芹菜(跟芹菜没有任何关系) 2 python中的一个分布式任务框架 执行异步任务(对立:同步任务):解决耗时任务,将耗时操作任务提交给celery去异步执行,比如发送短信 / 邮箱、消息推送、音频处理等等 执行延时任务( 5 分钟后干一件事):解决延迟任务 执行定时任务:每天,隔几分钟,干什么事:解决周期任务,比如每天统计数据 3 解释 Celery is a project with minimal funding, so we don’t support Microsoft Windows. Please don’t open any issues related to that platform.(不怎么支持windos) 4 celery特点(了解) 可以不依赖任何服务器,通过自身命令,启动服务(内部支持socket) celery服务为其他项目提供异步解决任务的需求 5 Celery架构 Celery的架构由三部分组成,消息中间件(message,broker)、任务执行单元(worker)和任务执行结果存储(task result store)组成 消息中间件 Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括RabbiMQ,Redis等等 任务执行单元 worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中<br><br> #任务结果存储<br>Task result store用来存储Worker执行的任务的结果,Celery支持以不同的方式存储任务的结果,Celery支持以不同的<br>方式存储任务的结果,包括AMQP,redis等<br><br><br><br><br><br> |
二、celery基本使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 1 写一个py文件 import celery #消息中间件 broker = 'redis://127.0.0.1:6379/1' #1 表示使用redis 1 这个db #结果存储(redis) backend = 'redis://127.0.0.1:6379/2' #2 表示使用redis 2 这个db #实例化得到的对象,指定中间件和结果存储 app = celery.Celery( 'test' ,broker = broker,backend = backend) @app .task def add(a,b): return a + b @app .task def mul(a,b): return a * b<br> 2 提交任务(在其他文件中)<br> from t_celery import add,mull<br>res = add.delay( 100 , 4 ) #delay表示异步<br> print(res) #id号<br><br>3 启动worker<br> #非window平台:celery worker -A t_celery -l info #info代表日志级别 <br> # windows装eventlet:celery worker -A t_celery -l info -P eventlet<br>4 查看执行结果<br>from t_celery import app<br>from celery.result import AsyncResult<br>#关键字,变量不能定义为关键字<br>id='5331c70b-1b51-4a15-aa17-2fa0f7952c00'<br>if __name__ == '__main__':<br> res=AsyncResult(id=id,app=app)<br> if res.successful():<br> result = res.get()<br> print(result)<br> elif res.failed():<br> print('任务失败')<br> elif res.status == 'PENDING':<br> print('任务等待中被执行')<br> elif res.status == 'RETRY':<br> print('任务异常后正在重试')<br> elif res.status == 'STARTED':<br> print('任务以及开始被执行')<br> <br><br><br><br><br><br><br><br><br> |
三、celery多任务结构
1 2 3 4 5 6 7 8 | package_celery: # 项目名 celery_task # celery包名 __init__.py celery.py # celery 的app,必须叫celery order_task.py # 任务 user_task.py # 任务 result.py # 结果查询 submit_tast.py # 提交任务<br><br>#运行worker(在package_celery目录下执行)<br>celery worker -A celery_task -l info -P eventlet<br>#提交任务<br>from celery_task import order_task,user_task<br>#提交一个给用户发短信的任务<br>res=user_task.send_sms.delay('1872465747')<br>print(res)<br>#提交一个取消订单任务<br>res=order_task.cancel_order.delay()<br>print(res)<br><br><br><br> |
# 真实应用场景
-秒杀系统
-不能秒超,使用锁(mysql悲观锁,乐观锁),redis锁
-提高并发量---》把同步做成异步---》使用celery
-前端点击秒杀按钮,向后端发送秒杀请求---》同步操作
-同步操作
-请求来到后端,判断数量是否够,如果够,要生成订单(mysql),订单状态是待支付状 态
-请求返回,告诉前端,秒杀成功
-异步操作
-请求来到后端,提交一个celery任务---》celery任务异步的执行判断数量是否够,如 果够,要生成订单(mysql)
-秒杀是否成功的结果还没有,直接返回了(返回任务id)
-前端启动一个定时任务,每隔5s,向后台发送一个查询请求,查询秒杀任务是否执行完 成(带着任务id查)
-如果是未执行状态,或者执行中---》返回给前端,前端不处理,定时任务继续执行
-又隔了5s,发送查询,查询到秒杀成功的结果,返回给前端,秒杀成功
四、高级使用之延时任务
1 | #celery执行延时任务<br>#第一种方式:2021年1月7日17点3分12秒发送短信<br>#from datetime import datetime<br>#eta:延迟多长时间执行,eta需要传时间对象,并且是utc时间<br>#v1 = datetime(2021,1,7,17,3,12)<br>print(v1)<br>v2 = datetime.utcfromtimestamp(v1.timestamp())<br>print(v2)<br>res=user_task.send_sms.apply_async( args=['1879531248',],eta=v2)<br><br>##第二种方式:隔几秒后执行<br>from datetime import datetime<br>from datetime import timedelta<br>ctime = datetime.now()<br>#默认用utc时间<br>utc_time = datetime.utcfromtimestamp(ctime.timestamp())<br><br>time_delay = timedelta(seconds=10)<br>task_time = utc_time + time_delay<br>print(task_time)<br>res=user_task.send_sms.apply_async(args=['18945456456',],eta=task_time)<br><br> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」