0

0

什么是Celery?如何使用它实现异步任务?

幻影之瞳

幻影之瞳

发布时间:2025-09-03 19:46:01

|

821人浏览过

|

来源于php中文网

原创

Celery适用于处理耗时任务,如发送邮件、处理视频等,通过消息队列实现异步执行和负载均衡;使用Flower可监控任务状态,支持重试、错误处理和死信队列应对任务失败。

什么是celery?如何使用它实现异步任务?

Celery是一个强大的分布式任务队列,简单来说,它让你能够把一些耗时的操作(比如发送邮件、处理上传的视频)放到后台去执行,而不用阻塞你的Web应用。这样,用户就能更快地得到响应,体验也就更好了。

Celery通过消息队列(通常是RabbitMQ或Redis)来传递任务,让你的任务可以在不同的服务器上运行,从而实现负载均衡。

解决方案:

首先,你需要安装Celery及其依赖:

pip install celery redis

这里我选择Redis作为消息代理,你也可以选择RabbitMQ。

然后,创建一个Celery实例,通常在一个单独的

celery.py
文件中:

# celery.py
from celery import Celery

app = Celery('my_project',
             broker='redis://localhost:6379/0',  # Redis作为消息代理
             backend='redis://localhost:6379/0',  # Redis作为结果存储
             include=['my_project.tasks'])       # 包含任务模块

# 可选配置
app.conf.update(
    result_expires=3600, # 任务结果过期时间
)

if __name__ == '__main__':
    app.start()

接下来,定义你的异步任务,例如在一个

my_project/tasks.py
文件中:

# my_project/tasks.py
from celery import shared_task
import time

@shared_task
def add(x, y):
    # 模拟耗时操作
    time.sleep(5)
    return x + y

要运行Celery worker,你需要打开一个终端,进入你的项目目录,然后执行:

celery -A my_project worker -l info

-A my_project
指定Celery应用,
-l info
设置日志级别为info。

现在,你可以在你的代码中调用这个异步任务:

from my_project.tasks import add

result = add.delay(4, 4)  # 异步调用,返回AsyncResult对象
print(result.id)  # 打印任务ID,可以用来追踪任务状态

# 稍后获取任务结果
# from celery.result import AsyncResult
# result = AsyncResult(task_id='你的任务ID', app=app)
# print(result.ready()) # 检查任务是否完成
# print(result.get())   # 获取任务结果

就是这样!Celery会将

add
任务放入消息队列,worker会从队列中取出任务并执行,并将结果存储在Redis中。

Celery的适用场景有哪些?

php中级教程之ajax技术
php中级教程之ajax技术

AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。它不是新的编程语言,而是一种使用现有标准的新方法,最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容,不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。《php中级教程之ajax技术》带你快速

下载

Celery非常适合处理需要较长时间才能完成的任务,例如:

  • 发送电子邮件
  • 处理图像或视频
  • 执行复杂的计算
  • 定期执行的任务(例如,每天凌晨备份数据库)
  • 与外部API交互

简单来说,任何你不希望阻塞用户请求的操作,都可以交给Celery来处理。

如何监控Celery任务的执行情况?

监控Celery任务的执行情况至关重要,可以帮助你及时发现并解决问题。Celery本身并没有提供内置的监控工具,但你可以使用一些第三方工具,比如:

  • Flower: 一个基于Web的Celery监控工具,可以实时查看任务状态、worker状态、队列长度等信息。安装很简单:

    pip install flower
    ,然后运行
    celery -A my_project flower

  • Celery Beat: 用于调度定期任务,可以配置任务的执行时间、频率等。你需要创建一个配置文件,指定要执行的任务及其执行时间。

  • 自定义监控: 你也可以自己编写监控脚本,通过Celery的API获取任务状态,并将数据存储到数据库或监控系统中。

选择哪种监控方式取决于你的具体需求和技术栈。Flower是一个不错的入门选择,简单易用,功能也比较完善。

如何处理Celery任务执行失败的情况?

任务执行失败是不可避免的,Celery提供了一些机制来处理这种情况:

  • 重试: 你可以使用
    retry
    方法让Celery自动重试失败的任务。可以设置重试次数和重试间隔。
@shared_task(bind=True, max_retries=3)
def add(self, x, y):
    try:
        # 模拟可能出错的操作
        result = x / (y - 2)
        return result
    except Exception as exc:
        self.retry(exc=exc, countdown=5) # 5秒后重试
  • 错误处理: 你可以使用
    on_failure
    方法来处理任务执行失败的情况。可以发送错误通知、记录日志等。
@shared_task(on_failure=error_handler)
def my_task(x, y):
    return x + y

def error_handler(uuid, args, kwargs, einfo):
    print(f"任务 {uuid} 执行失败: {einfo}")
    # 发送错误通知
  • 死信队列: 将执行失败的任务放入死信队列,稍后进行分析和处理。

选择哪种处理方式取决于你的具体需求。对于一些临时性的错误,重试可能是一个不错的选择。对于一些无法自动恢复的错误,需要进行人工干预。

相关专题

更多
rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

199

2024.02.23

什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

319

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

228

2023.10.07

pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

333

2023.10.09

更新pip版本
更新pip版本

更新pip版本方法有使用pip自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。

397

2024.12.20

pip设置清华源
pip设置清华源

设置方法:1、打开终端或命令提示符窗口;2、运行“touch ~/.pip/pip.conf”命令创建一个名为pip的配置文件;3、打开pip.conf文件,然后添加“[global];index-url = https://pypi.tuna.tsinghua.edu.cn/simple”内容,这将把pip的镜像源设置为清华大学的镜像源;4、保存并关闭文件即可。

740

2024.12.23

python升级pip
python升级pip

本专题整合了python升级pip相关教程,阅读下面的文章了解更多详细内容。

337

2025.07.23

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

366

2023.07.18

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 1.9万人学习

手把手实现数据传输编码
手把手实现数据传输编码

共1课时 | 706人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号