Celery:给你的Python添加异步魔法!

文摘   2024-11-18 19:03   重庆  

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),

    },

}

  1. 任务重试机制:

@app.task(bind=True, max_retries=3)

def might_fail(self):

    try:

        # 可能会失败的操作

        raise Exception(“糟糕,出错了!”)

    except Exception as e:

        self.retry(countdown=60) # 一分钟后重试

  1. 任务优先级:

@app.task(priority=10)

def high_priority_task():

    pass

🌟 温馨提示:优先级功能需要中间件支持,Redis不支持,得用RabbitMQ。


写代码时经常会碰到需要异步处理的场景,比如批量处理Excel、爬虫、图片处理这些费时的活。用Celery往后台一丢,程序立马就能继续往下跑,用户体验瞬间就上去了。


只要搞清楚任务该咋写,broker咋配置,就能玩转80%的异步处理场景。剩下的就是实战中慢慢积累经验了。


记住一点:写异步任务时,代码一定要考虑失败重试和幂等性,不然真出问题了想调试都难。


学会了Celery,你就有了一个处理异步任务的得力助手,代码世界里的生产力直接起飞!

CQTV新视界
重庆广电城市TV旗下优质内容品牌,感谢您的关注!
 最新文章