Celery初探

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Celery初探

网络异常,图片无法展示
|



1、前言


在日常的开发工作中,当我们的Api中有一个动作需要很长时间才能完成的时候,我们就可以将这个动作作为一个任务交给Celery去异步执行,执行完再将结果返回给用户。在这个过程中Celery就充当了一个任务调度的角色。


以上就是Celery的一个典型使用场景,Celery是一个基于分布式消息的任务队列,支持多种并发方式。


2、快速开始


2.1、创建虚拟环境


mkdir celeryy && cd celeryy
pdm init
复制代码


2.2、安装Celery


pdm add celery
复制代码


2.3、安装eventlet(windows)


pip install eventlet
复制代码


2.4、启动Redis


cd redis
.\redis-server.exe redis.windows.conf
复制代码


2.5、编写task文件


# celeryy/celery_task.py
from celery import Celery
app = Celery('tasks', broker='redis://localhost:6379/0',backend='redis://localhost:6379/1')
@app.task
def add(x, y):
    return x + y
复制代码


2.6、启动Celery应用


windows需要依赖eventlet模块启动。


cd celeryy
celery -A celery_task worker --loglevel=info -P eventlet
复制代码


2.7、调用task


# celeryy/run.py
from celery_task import add
import time
t1 = time.time()
r1 = add.delay(1, 2)
r2 = add.delay(2, 4)
r3 = add.delay(3, 6)
r4 = add.delay(4, 8)
r5 = add.delay(5, 10)
r_list = [r1, r2, r3, r4, r5]
for r in r_list:
    while not r.ready():
        pass
    print(r.result)
t2 = time.time()
print('共耗时:%s' % str(t2-t1))
复制代码


代码执行结果:


E:\celeryy>python run.py
3
6
9
12
15
共耗时:8.324045658111572
复制代码


3、Celery原理分析


网络异常,图片无法展示
|


简单来说,Celery就是一个分布式的任务调度和执行器。即当我们有一些耗时的任务,我们可以将这些任务托管给Celery,然后需要调用的时候,直接在业务代码中导入这个被Celery托管的任务,然后利用这些任务自带的delay方法对齐进行调用(生产者),然后这些任务就会被Celery通过broker(Redis等消息代理)通知到Worker(消费者)进行执行,最后任务的执行结果会被保存到backend中去。


需要注意的是,当我们的业务接口A执行了创建了Celery的异步任务的同时,给任务一个默认的状态。后续我们可以根据任务的key去查询任务的状态。


3.1、任务状态查询


上面的代码中,我们使用了ready方法去检查任务状态。但是任务的执行结果都是会被保存到backend中的,我们可以登录到backend中去查看任务的状态。


可以通过delay的返回值对象的id属性去获取当前task的id。


r = add.delay(1,2)
print(r.id)
复制代码


根据task的id去Redis(backend)中去查询这个task的执行结果:


127.0.0.1:6379[1]> get celery-task-meta-af1f9d6b-73d9-43f9-aa99-35a6918554a4
"{"status": "SUCCESS", "result": 15, "traceback": null, "children": [], "date_done": "2022-06-15T09:24:48.470345", "task_id": "af1f9d6b-73d9-43f9-aa99-35a6918554a4"}"
复制代码


如此,我们就完整的使用Celery达到了任务异步执行以及结果刷新的目标。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4月前
|
NoSQL 调度 Redis
Celery
【10月更文挑战第10天】
58 4
|
5月前
|
消息中间件 存储 BI
|
6月前
|
消息中间件 监控 调度
Celery与RabbitMQ的结合【Python】
【8月更文挑战第18天】 Celery与RabbitMQ结合是构建高效Python分布式系统的利器。Celery作为分布式任务队列,支持任务调度与结果管理;RabbitMQ则确保了消息的可靠传递。二者联用不仅提升了系统的异步处理能力,还增强了其扩展性与可靠性。通过简单的安装与配置,即可实现任务的异步执行与调度,同时利用监控工具优化性能并确保安全性。这种组合适用于需要处理大量异步任务的应用场景,极大地简化了分布式系统的设计与实现。
118 0
|
8月前
|
消息中间件 NoSQL Redis
【译】Celery文档1:First Steps with Celery——安装和配置Celery
【译】Celery文档1:First Steps with Celery——安装和配置Celery
120 14
|
8月前
|
消息中间件 存储 前端开发
【译】Celery文档2:Next Steps——在项目中使用Celery
【译】Celery文档2:Next Steps——在项目中使用Celery
|
8月前
|
数据库 Python
【译】Celery文档3:在Django中使用Celery
【译】Celery文档3:在Django中使用Celery
101 0
|
消息中间件 开发框架 NoSQL
celery--介绍
celery--介绍
|
缓存 NoSQL Redis
celery--实现异步任务
celery--实现异步任务
|
消息中间件 监控 NoSQL
python3.7+Tornado5.1.1+Celery3.1+Rabbitmq3.7.16实现异步队列任务
在之前的一篇文章中提到了用[Django+Celery+Redis实现了异步任务队列](https://v3u.cn/a_id_54),只不过消息中间件使用了redis,redis作为消息中间件可谓是差强人意,功能和性能上都不如Rabbitmq,所以本次使用tornado框架结合celery,同时消息中间件使用Rabbitmq来实现异步发邮件,并且使用flower来监控任务队列。
python3.7+Tornado5.1.1+Celery3.1+Rabbitmq3.7.16实现异步队列任务