Celery:给你的Python添加异步魔法!
作为一个Python开发者,经常会遇到一些耗时的任务让程序卡得不要不要的。比如发送邮件、处理大量数据、调用第三方API,这些任务放在主程序里跑,用户等得都要睡着了。今天跟大家聊聊 Celery ,一个超好用的任务队列工具,它能帮我们把这些烦人的任务丢到后台去跑。
Celery就像是一个超级管家,负责帮你分发和处理各种任务。它主要由三部分组成:
# 创建Celery实例
from celery import Celery
app = Celery('my_project',
broker='redis://localhost:6379/0',
backend='redis://localhost:6379/0')
# 定义一个异步任务
@app.task
def add(x, y):
return x + y
🌟 温馨提示:broker(消息中间件)必须要配置,不然Celery无法启动。Redis和RabbitMQ是最常用的选择。
用Celery处理异步任务贼简单,看代码:
# tasks.py
from celery import Celery
app = Celery('tasks')
@app.task
def send_email(to_address, content):
# 模拟发送邮件
print(f“正在给{to_address}发送邮件...”)
import time
time.sleep(5) # 假装在处理
return True
# main.py
from tasks import send_email
# 调用异步任务
result = send_email.delay('user@example.com', '你好呀!')
print('邮件任务已提交,我可以干别的了~')
Celery的任务状态跟踪也很方便:
# 获取任务结果
result = send_email.delay('user@example.com', '你好呀!')
print(result.ready()) # 检查任务是否完成
print(result.get()) # 获取任务结果,会阻塞等待
🌟 温馨提示:使用get()方法时要小心,它会阻塞程序直到任务完成。如果不想等,可以加个timeout参数。
想每天定时执行某个任务?Celery也能搞定:
from celery.schedules import crontab
app.conf.beat_schedule = {
'每天早上8点发送报告':{
'task':'tasks.send_daily_report',
'schedule':crontab(hour=8, minute=0),
},
}
任务重试机制:
@app.task(bind=True, max_retries=3)
def might_fail(self):
try:
# 可能会失败的操作
raise Exception(“糟糕,出错了!”)
except Exception as e:
self.retry(countdown=60) # 一分钟后重试
任务优先级:
@app.task(priority=10)
def high_priority_task():
pass
🌟 温馨提示:优先级功能需要中间件支持,Redis不支持,得用RabbitMQ。
写代码时经常会碰到需要异步处理的场景,比如批量处理Excel、爬虫、图片处理这些费时的活。用Celery往后台一丢,程序立马就能继续往下跑,用户体验瞬间就上去了。
只要搞清楚任务该咋写,broker咋配置,就能玩转80%的异步处理场景。剩下的就是实战中慢慢积累经验了。
记住一点:写异步任务时,代码一定要考虑失败重试和幂等性,不然真出问题了想调试都难。
学会了Celery,你就有了一个处理异步任务的得力助手,代码世界里的生产力直接起飞!