

celery 简单案例 》》以redis 为例,
csharp
# pip install "celery[redis]"
这个命令,是为了帮你一次性地把 Celery 和它使用 Redis 时需要的额外依赖都装上
这是 pip 提供的一个"可选依赖"安装方式。这里的 [redis] 被称为"extra",它告诉 pip,在安装 Celery 主程序外,还需要安装专门为 Redis 准备的一组附加的 Python 库。




csharp
## 项目结构
kaizen_celery/
├── tasks.py #
└── produce.py
└── consumer.py
# task.py
from celery import Celery
import time
backend='redis://127.0.0.1:6379/1'
broker='redis://127.0.0.1:6379/2'
##### 创建 Celery 应用实例=======
# name : 应用名称
# broker:消息中间件地址,此处使用 Redis
# backend:任务结果存储地址,此处也使用 Redis(可选)
cel = Celery(
'celery', # 应用名称
broker=broker, # 任务队列地址
backend=backend # 结果存储地址
)
@cel.task
def send_msg(user,msg):
print(f"准备向用户{user}发送消息") # 该输出会显示在 worker 日志中
time.sleep(5)
print(f"消息发送成功,内容:{msg}") # 该输出会显示在 worker 日志中
return "OK"
# produce.py
from tasks import send_msg
# 异步调用:不等待结果,立即返回AsyncResult对象
result = send_msg.delay("Kaizen","恭喜你") # 相当于 send_msg.delay("Kaizen","恭喜你") 放入队列
print(result.id) # 返回任务唯一ID
# 检查任务是否完成
result.ready() # Fasle 表示尚未执行完 True 表示执行完毕
# 获取结果,会阻塞直到任务完成 timeout 是可选参数
result.get(timeout=10) # 等待最多10S, 如何超过10S 还没返回 则抛异常 celery.exceptions.TimeoutError
#常用任务调用方式 对比
send_msg.delay(x,y) 异步发送任务,立即返回AsyncResult 不阻塞
send_msg.apply_async(args=[x,y],countdown=10) 延迟10s后执行 不阻塞
send_msg.apply_async(args=[x,y],queue='high_priority') 指定队列 不阻塞
send_msg(x,y) 直接同步调用,不走worker,本地执行 阻塞
=========================================
# consumer.py
from celery.result import AsyncResult
from tasks import cel
async_result = AsyncResult(id="上面produce返回的id",app=cel)
if async_result.successful():
result = async_result.get()
print(result)
elif async_result.failed():
print('执行失败')
elif async_result.status =="PENDING":
print("任务等待中")
elif async_result.status =="RETRY":
print("任务异常,正在重新尝试")
elif async_result.status =="STARTED":
print("任务执行中")
# 启动 Celery Worker
# 需要先安装 pip install eventlet
celery -A tasks worker --loglevel=info -P eventlet
启动 Celery worker




