celery笔记一之celery介绍、启动和运行结果跟踪-环球热文
本文首发于公众号:Hunter后端原文链接:celery笔记一之celery介绍、启动和运行结果跟踪
【资料图】
本篇笔记内容如下:
celery 介绍celery 准备celery 启动和异步任务的运行运行结果跟踪1、celery 介绍celery 大致有两种应用场景,一种是异步任务,一种是定时任务。
比如说在一个接口请求中,某个函数执行所需的时间过长,而前端页面并不是立刻需要在接口中获取处理结果,可以将这个函数作为异步任务,先返回给前端处理中的信息,在后台单独运行这个函数,这就是异步任务。
另一个比如说某个函数需要每天晚上运行一遍,不可能人天天守着后台手动执行一遍这个函数,那么就可以用 celery 来实现这个定时的周期任务。
接下来介绍一下 celery 的组成:
task
这个任务就是我们前面举的例子的异步任务或者是定时任务,即为 task,我们可以定义这些任务,然后发送到 broker
broker
broker 可以理解成消息中间件,用于获取异步或者定时任务,形成一个或多个消息队列,然后发送给 worker 处理这些消息
broker 的形式可以是 Redis,RabbitMQ 或者其他,这里我们使用 Redis 作为消息中间件
worker
worker 是处理消息的程序,获取 broker 中的消息,然后在 worker 中执行,然后根据配置决定将处理结果发送到 backend
result_backend
在 worker 处理完消息之后会有 return 或者没有返回结果,都会根据配置将结果发送出来,可以配置成发送到 redis 中,也可以将之存储到 database 中
beat
主要用于调用定时任务,根据设定好的定时任务,比如每天晚上十点执行某个函数,beat 则会在相应的时间将这个 task 发送给 broker,然后 worker 获取任务进行处理
定时任务除了说的每天晚上十点这种周期任务,也可以是间隔任务,比如说每隔多少秒,多少分钟执行一次
注意:异步任务的发送是不经过 beat 处理,直接发送给 broker 的
在上面的结构中,broker 需要将相应的服务比如 redis 运行起来,而 worker 和 beat 需要在手动用程序运行,而且每次更改了定时策略之后需要重新启动 beat 和 worker 才能生效。
2、celery 准备接下来我们实现一个最简单的异步任务,在执行异步任务前,我们做如下的准备工作
1.安装依赖我们需要安装一下 celery 和 redis 的依赖:
pip3 install celery==5.1.2 -i https://mirrors.aliyun.com/pypi/simple/pip3 install redis==3.5.3 -i https://mirrors.aliyun.com/pypi/simple/
2.消息中间件这里我们用到的消息中间件是 redis,可以去官网下载一个 redis 启动,也可以使用 docker 来执行安装。
我在之前的 docker 系列笔记中有介绍过如何拉取镜像和运行容器,我们这里直接使用 docker 来运行:
docker run -itd -p 6379:6379 redis:latest
3.异步任务准备我们准备一个最简单的 add() 函数,放在 tasks.py 文件中:
# tasks.pyfrom celery import Celeryapp = Celery("tasks", broker="redis://localhost/0", backend="redis://localhost/1")@app.taskdef add(x, y): return x + y
在这段代码里,我们引入 Celery 模块,并将其实例化为 app,且配置了 broker 参数,表示消息队列都会被放在 redis 的第一个数据库下
指定的 backend 参数则表示函数运行的结果被放在 redis 的第二个数据库下
然后用 @app.task 修饰 add 函数,表示它是 app 下的 task 任务
以上,我们的准备工作就完成了,接下来尝试运行这个异步任务
3、celery 启动和异步任务的运行说是 celery 的启动,其实是 worker 的启动,中间件是 redis,已经在前面的步骤中启动了。
我们在 tasks.py 所在的文件夹下执行下面的命令:
celery -A tasks worker -l INFO
在这里,tasks 是我们任务所在的文件名,worker 表示启动的是 worker 程序
-l INFO 则会在控制台打印出 worker 接收到的消息详情,如果不执行,则信息流不会被打印出来
执行了上面的程序后,可以看到控制台会输出下面这种信息:
-------------- celery@localhost v5.1.2 (sun-harmonics)--- ***** ----- -- ******* ---- Darwin-21.4.0-x86_64-i386-64bit 2022-07-17 23:56:09- *** --- * --- - ** ---------- [config]- ** ---------- .> app: tasks:0x7fc8ddf3df98- ** ---------- .> transport: redis://localhost:6379/0- ** ---------- .> results: disabled://- *** --- * --- .> concurrency: 12 (prefork)-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)--- ***** ----- -------------- [queues] .> celery exchange=celery(direct) key=celery [tasks] . tasks.add[2022-07-17 23:56:09,685: INFO/MainProcess] Connected to redis://localhost:6379/0[2022-07-17 23:56:09,699: INFO/MainProcess] mingle: searching for neighbors[2022-07-17 23:56:10,737: INFO/MainProcess] mingle: all alone[2022-07-17 23:56:10,780: INFO/MainProcess] celery@localhost ready.
则表示 worker 启动成功
执行异步任务
在另一个 shell 窗口,进入 python 的交互界面,输入以下命令:
from tasks import addres = add.delay(1,2)
add 是我们需要执行的异步任务的函数名
delay 是异步任务执行的特有方法,这个其实是 apply_async() 函数的简便写法,不带任何参数,apply_async() 除了可以实现异步任务的功能,还可以指定多少时间后执行,比如说二十秒后执行,这个在后面的笔记中我们再介绍。
而异步任务的返回我们这里用 res 来定义,它是一个包含了这个任务所有执行信息对象,有任务状态(是否执行成功),有返回结果(add() 函数的return),还有这个 task 特有的标识 id等信息
至此,我们的一个异步任务的执行就完成了,我们可以在下一步查看它的运行结果等信息。
4、运行结果跟踪接下来,我们在 tasks.py 中建立下面几个函数,来测试我们对结果的跟踪:
# tasks.pyimport timefrom celery import Celeryapp = Celery("tasks", broker="redis://localhost/0", backend="redis://localhost/1")@app.taskdef add(x, y): return x + y@app.taskdef div(x, y): return x / y@app.taskdef test_not_finished(): time.sleep(30) return True
然后重新运行 worker:
celery -A tasks worker -l INFO
然后引入和执行函数:
from tasks import add, div, test_not_finished
获取延时任务的结果
res = add.delay(1, 2)print(res.result)# 也可以使用 get() print(res.get())
get() 函数也可以加个超时的设置:
res.get(timeout=2)
但是这样需要注意,因为如果超时了还未获取到结果,程序就会报错
判断函数运行是否完成
print(res.ready())
打印出的结果为 True 则表示函数运行完成
我们可以测试函数为完成的状态:
res2 = test_not_finished.delay()
在这个函数里,我们设置了 30s 的休眠,所以在 30s 內我们打印结果可以看到 res2.ready() 是为 False 的:
print(res2.ready())
获取task id
每个被执行的 task 都有各自对应的 id 作为它们的唯一键:
print(res.id)
查看任务执行的状态
# 任务执行是否失败,返回 布尔型数据is_failed = res.failed()# 任务执行是否成功,返回布尔型数据is_successful = res.successful()# 执行的任务所处的状态state = res.state# state 的值会在 PENDING,STARTED,SUCCESS,RETRY,FAILURE 这几种状态中,分别是 待处理中,任务已经开始,成功,重试中,失败
报错处理
如果执行的延时任务在程序中报错,比如我们定义的 div() 函数,我们传入的除数为 0 的话,在程序中是会报错的,我们使用 get() 来获取结果的话程序是会报错的:
res3 = div.delay(3, 0)res3.get()# 返回会报错
但是我们可以使用 propagate=False 参数来忽略程序的报错:
res3.get(propagate=False)
这样我们获取的就不是程序报错,而是程序报错的信息作为结果返回
使用 res3.state 发现返回的结果是 FAILURE
当延时任务在程序中报错,它的返回值就不会是正确的,我们可以通过 res3.traceback 是否有值来判断函数运行过程中是有报错:
if res3.traceback: print("延时任务报错")else: print("程序正常运行,可以获取返回值")
result资源释放
因为 backend 会使用资源来保存和传输结果,为了确保资源被释放,所以在执行完异步任务后,你必须对每一个结果调用 get() 或者 forget() 函数
result.get() 函数获取结果
result.forget() 在 backend 删掉该数据
在官方文档上,意思是 get() 和 forget() 方法都可以释放资源,但是经过我测试,貌似只有 forget() 函数会释放资源
查看是否资源被释放也很简单,登录到对应的 backend,我这里是 redis,使用 redis-cli 或者通过 docker 进入 redis:
select 1keys*
查看相应的 task id 是否还在列表就可以知道该资源是否被释放
如果不想手动释放资源,可以在配置里设置一个过期时间,那么结果就会在指定时间段后被释放:
app.conf.update(result_expires=60)
这个我们可以在后面的配置里再详细介绍。
以上就是本篇笔记全部内容,下一篇笔记我们将介绍如何建立一个 celery 项目、配置的几种方法及一些基本的配置。
如果想获取更多后端相关文章,可扫码关注阅读:
标签:
推荐
-
-
-
凯因科技:KW-027注射液为公司第二款进入临床阶段的乙肝创新药 目前正处于临床Ⅰ期阶段|世界观焦点
凯因科技近期接受投资者调研时表示,KW-027注射液为公司第二款进入临床阶段的乙肝创新药,目前正处于临床Ⅰ
来源: -
-
-
celery笔记一之celery介绍、启动和运行结果跟踪-环球热文
>本文首发于公众号:Hunter后端>原文链接:[celery笔记一之celery介绍、启动和运行结果跟踪](https: mp we
来源: -
-
-
moto razr 40 Ultra发布:折起来也是全面屏_全球资讯
在今晚7点,moto召开夏季发布会,会中正式发布了motorazr40Ultra手机。摩托罗拉motorazr40ultra折叠屏新机5
来源: -
-
观点:神舟十五号搜救回收任务进行最后一次全系统综合演练 东风着陆场准备就绪迎接航天员回家
新华社酒泉6月1日电(李国利、奉青玲)神舟十五号搜救回收任务6月1日凌晨按照全系统、全状态、全流程,组织
来源: -
-
-
vivox23手机屏幕卡死了怎么办(vivox23手机屏幕多少钱)_焦点要闻
1、查询到vivoX23目前屏幕价格是599元,如需更换配件,可以携带手机到当地vivo客户服务中心检测处理;客户
来源: -
-
-
-
-
-
凯因科技:KW-027注射液为公司第二款进入临床阶段的乙肝创新药 目前正处于临床Ⅰ期阶段|世界观焦点
凯因科技近期接受投资者调研时表示,KW-027注射液为公司第二款进入临床阶段的乙肝创新药,目前正处于临床Ⅰ
来源: -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
财富更多》
-
热门看点:广钢气体6月8日上交所首发上会 拟募资11.5亿元
广钢气体6月8日上交所首发上会拟募资11...
-
恒兴科技6月8日上交所首发上会 拟募资9亿元|天天热消息
恒兴科技6月8日上交所首发上会拟募资9亿...
-
众泰汽车:推举董事叶长青代为履行董事长职责
众泰汽车:推举董事叶长青代为履行董事...
-
实际使用感受如何?来看看这份《人工智能大模型体验报告》
实际使用感受如何?来看看这份《人工智...
-
百事通!天助畅运6月8日深交所首发上会 拟募资5.79亿元
天助畅运6月8日深交所首发上会拟募资5 ...
动态更多》
热点
- realme10系列正式宣布 采用双曲面屏正面顶部居中挖孔
- 五菱全新微型电动车内饰官图发布 座椅采用星际形打孔工艺
- 努比亚Z40星空典藏版正式开售 采用微米级油画笔触纹理技术
- iQOO11系列正式官宣 首批搭载骁龙8Gen2机型之一
- 海信34英寸带鱼屏显示器发布 支持165Hz刷新率
- OPPO明年将商用240W超级闪充 新一代电芯支持更高倍率充电
- 第一款Android手机渲染图曝光 横向滑盖设计和全尺寸键盘
- 吉利首款纯电皮卡11月9日上市 车辆续航里程超过610公里
- 努比亚Z40SPro星空典藏版正式公布 堪称窄边框天花板
- vivo无线运动耳机2今日正式上市 首销只要119元
- 实际使用感受如何?来看看这份《人工智能大模型体验报告》
- 世界快报:永达股份6月8日深交所首发上会 拟募资10.66亿元
- “农业产业化龙头企业助力乡村振兴光彩行动”在临沂市举行 世界新资讯
- 容汇锂业6月8日深交所首发上会 拟募资30.6亿元
- 三门峡戴卡公司召开安全生产月活动启动仪式暨6月份安全环保办公会|环球热闻
- 百事通!天助畅运6月8日深交所首发上会 拟募资5.79亿元
- 果然开挂民族 印度一男子在行驶车顶做俯卧撑喝酒
- 快报:6月份起一批新规开始实施
- 华为“T-AUTO”,全光传送品质演进新理念 天天热点评
- 淄博好品:有量有质有故事 短讯
- 凡人微光|“童”款互动|全球微资讯
- 聚辰股份(688123.SH):目前部分中小容量的NOR Flash产品已通过第三方权威机构的AECQ100 Grade 1车规电子可靠性试验验证
- 【当前独家】足金回收多少钱一克(2023年6月1日)
- 都挺好的朱丽和明成和好了吗_都挺好朱丽和明成怎么离的婚
- 2023世界钾盐钾肥大会暨格尔木盐湖论坛将于6月7日举行_全球消息
- 当前热讯:装光伏送家电,TCL光伏科技加速布局分布式光伏市场 | 最前线
- 环球热头条丨南方传媒涨9.98% 三个交易日机构净卖出1.37亿元
- 景旺电子涨6.23% 三个交易日机构净卖出4.99亿元
- 观热点:电广传媒涨9.98% 机构净买入1.02亿元
- C919首航成功具有多重意义
- 天天观天下!证监会同意飞南资源、舜禹水务创业板IPO注册
- 当前快播:半导体板块跌0.65% 新相微涨88.46%居首
- 全球最新:重磅微视频:少年志丨美好的未来属于你们
- 淄博市2023年“安全生产月”活动启动_热点评
- 淄博:引金融活水 赋能传统产业发展
- 市气象局预测今年汛期短期气候趋势
- 淄博好品:有量有质有故事
- 无形资产定义 新会计准则_无形资产定义|最新快讯
- 就“二阳”这事,我的家族群里都聊出共识了,真是又好气又好笑…
- 女富豪朱林瑶涉嫌被查|每日热议
- 新致软件: 《关于上海新致软件股份有限公司可转换公司债券交易异常波动的询证函》的回函 全球快资讯
- 格灵深瞳(688207.SH):机器人感知与控制技术是公司的核心技术之一
- 6月1日起,石家庄住房公积金管理中心作息时间调整
- 权威发布 | 淄博2023年汛期短期气候趋势预测情况
- 权威发布 | 淄博市发布“麦收期间天气提醒” 环球动态
- 世界速讯:回首那些我们一起走过的童年
- 世界热推荐:多彩“六一” 快乐成长
- 大朋友、小朋友们,快来打卡!
- 130.44亿!深圳世茂深港国际中心拟被拍卖 焦点热讯
- 5月销量成绩瞩目 新能源战略引领红旗品牌再向上
- 哪吒汽车回应最快本月赴港IPO:消息不实
- 快资讯丨盈科生物完成超3亿元B轮融资
- 单细胞生物_单细胞
- 中国石化在天津成立新公司 注册资本1亿 焦点滚动
- 产品换新,旧机何去何从?戴森“机主服务”又有新升级
- 网约车司机偷拍女乘客大腿,将视频发给同行炫耀被抓现形!|环球资讯
- react生命周期有哪些_react生命周期 世界观速讯
- 【时快讯】2023年上海生育津贴发放标准
- 雷鸟创新与高通合作,为AR可穿戴设备提供开创性的用户体验 全球报资讯
- 热门:中国新能源车企5月交付量一览
- 人最多感染8次新冠?真相来了! 每日观察
- 世界焦点!少年志丨幸福无非八个字:干我所爱 爱我所干
- 你爱我吗当然爱了是什么歌曲_你爱我吗当然爱了是什么歌-天天时快讯
- 看点:《花戎》官宣定档今晚开播 花戎原著小说叫什么?
- 景嘉微拟定增募资不超42亿元 2022年经营现金净额-3亿-每日视点
- 财报解读:扣非净利润扭盈转亏,中望软件销售费用再创新高 看热讯
- 恒流科技完成数千万天使轮融资-环球看点
- 当AI“插手”童年,人人都有“哆啦A梦”的美梦要成真了?
- 京东科技小微金融报告发布 小微企业贷款需求回升
- ChatGPT高三考试仅物理得零分 网友:原来AI也会偏科 全球视讯
- 美国滥用美元霸权 “去美元化”趋势加速 天天通讯
- 从苹果App Store应用商店下架 百度网盘回应|播报
- 恒大财富:资金回笼情况不理想 5月无法按原标准兑付|热文
- 美正考虑限制投资和技术流向中国半导体等领域,外交部:密切关注!
- 中国A股6月收获“开门红”
- 灌云税务:税宣进校园 普法伴成长_环球微头条
- 《促进北京市智能传感器创新生态高质量发展倡议书》近日发布-当前关注
- 环球关注:日本政府表态:不会对AI训练使用的数据实施版权保护
- 少年志|给孩子一份特别的六一礼物-全球消息
- 淄博市跨省异地就医直接结算政策集中宣传月活动启动-全球聚看点
- 爱心点亮“六一” 侨乡青田“侨留守儿童”欢乐过佳节
- 当前报道:2022年淄博市广播电视台公开招聘工作人员拟聘用人员公示
- 时讯:“美丽乡村行”步履不停!“滴灌式”宣传让交通安全走进千家万户
- 最美的“六一”儿童节礼物 张店交警暖心护学获赠锦旗
- 焦点热讯:我是大侦探节目分析_我是大侦探 湖南卫视大型情境类益智互动推理秀
- 视睿科技完成近亿元A轮融资
- 合肥市曙光小学开展庆“六一”活动
- 新相微上市首日涨88.5% 募10.3亿经营现金流连负两年|天天即时
- Key社文字冒险游戏《时廻者》Steam页面上线 支持中文
- 武汉蓝电北交所首日涨3.6% 募资2.85亿长江证券保荐-世界快播报
- 天天热推荐:Runway获谷歌投资,加速AI在影视创作中的应用
- 棒棒交接!太空再“会师” 天宫开启新征程→
- 东北什么树种适合发展_DBSM是指什么
- OpenAI 首席执行官与欧盟再度举行会谈 计划在欧洲建立新总部|每日讯息
- 百度网盘在苹果App Store下架 官方回应:紧急沟通中
- 提振消费信心 业界创新举措护航食品安全
- 茅台私募基金公司增资至7.39亿 增幅约146%
- 山西通报12款侵害用户权益APP 山西银行晋商银行在列|当前播报
- 无信不立,做人之本——淄博市张店区齐德学校“诚信”主题教育活动纪实 全球快播
- 淄博市中医医院·淄博市骨科医院开展“全球爱足日”公益义诊活动
- 淄博市自然资源和规划局张店分局:专项巡查到期临时用地
- 高低温试验箱出现故障如何解决|世界信息
- 【时快讯】小孩扁桃体发炎引起的发烧怎么办_宝宝扁桃体发炎引起发烧怎么办
- 【新要闻】委内瑞拉国会议员:美国持续拱火导致俄乌冲突难以结束
- 每日信息:孙亮方食生梅文言文黄门这样做的_孙亮方食生梅
- 马斯克到北京第一天吃了啥?疑似菜单曝光!-世界热闻
- 比亚迪:公司未被列入经营异常名录
- 长虹电子成立爱创天算公司_全球简讯
- 春茧收购有条不紊进行中 价格同比上涨一成
- 阿里AI新品“通义听悟”正式上线 智能总结、实时语音转文字等 即时看
- 中国自主开发设计油轮外高桥口岸首航出海 每日头条
- 小米618开门红多平台全面开花!K60系列小米13杀疯了-环球最资讯
- win10不激活影响使用吗?win10激活后会自动更新吗?
- 新疆乡村书记:沙漠里蹚出致富路_每日快报
- 怪兽充电宝可以异地归还吗?怪兽充电宝的归还按键在哪?
- 分析师提高预期的同时表示微软的 AI 机会可能比云更大 今日要闻
- 电脑的平板模式是用手点的吗?电脑的平板模式怎么用不了?
- 实时焦点:AITO问界系列5月交付量5629辆 环比增长22.7%
- 笔记本自动关机是什么原因?笔记本电脑关机后要拔电源吗?
- 实现天下无“鬼秤”,需要更多努力
- 电脑风扇声音大怎么办?电脑风扇不转了怎么修理?
- 金沙江上游国家风光一体化示范基地两大项目开工
- 微信更新不了是什么原因?微信更新在哪里可以更新?
- 微信冻结账号后会怎样?微信冻结账号后多久可以解冻?
- 早资道 | 字节跳动:没有成立“字节跳动教育联盟”计划;三六零发布360智脑视觉大模型 当前看点
- 怎么给电脑设置开机密码?电脑设置密码怎么设置?
- 汇丰:中国与东盟多领域合作深化 为区域内企业带来新机遇
- 如何恢复微信聊天记录?微信聊天记录删了能调出来吗?
- airpods充电需要拿出耳机吗?airpods的语音播报怎么关闭?
- 天天快报!金至尊铂金多少钱一克(2023年06月01日)参考价格
- 电脑设置密码怎么设置?电脑密码提示是什么意思?
- oppo手机截屏怎么截?oppo手机截屏卡住了怎么办?
- 泰和新材:国泰基金、中金资管等多家机构于5月30日调研我司 当前关注
- 电脑无法启动怎么回事?电脑屏幕倒过来了怎么恢复?
- 笔记本电脑怎么调亮度?笔记本电脑亮度多少对眼睛好?