Python Celery:高效处理异步任务的必备神器

d892ce3508d0f3342290b939803ad310.png

更多Python学习内容:ipengtao.com

Celery是一个简单、灵活且可靠的分布式系统,用于处理大量消息并提供实时操作。它是用Python编写的,并且可以在Web开发、数据处理和自动化任务中广泛应用。Celery支持任务的异步执行、定时执行和任务重试,能够与各种消息代理(如RabbitMQ和Redis)和结果存储后端无缝集成。本文将详细介绍Celery库的安装、主要功能、基本操作、高级功能及其实践应用,并提供丰富的示例代码。

安装

Celery可以通过pip进行安装。确保Python环境已激活,然后在终端或命令提示符中运行以下命令:

pip install celery

如果打算使用Redis作为消息代理,还需要安装redis

pip install redis

主要功能

  1. 异步任务执行:支持任务异步分发和执行。

  2. 定时任务:可以定时或周期性地执行任务。

  3. 任务重试:支持任务失败后的自动重试机制。

  4. 任务结果存储:可以存储任务的执行结果并进行检索。

  5. 扩展性:支持自定义中间件和扩展,适用于复杂的分布式系统。

基本操作

配置Celery

首先,需要配置Celery应用。

以下示例展示了如何配置一个简单的Celery应用,并使用Redis作为消息代理:

from celery import Celery

app = Celery('myapp', broker='redis://localhost:6379/0', backend='redis://localhost:6379/0')

app.conf.update(
    result_expires=3600,
)

定义任务

Celery任务是通过装饰器定义的。

以下示例展示了如何定义一个简单的任务:

@app.task
def add(x, y):
    return x + y

发送任务

可以通过调用任务函数的delay方法将任务发送到消息队列:

result = add.delay(4, 6)
print(result.id)  # 输出任务ID

获取任务结果

可以通过任务ID获取任务的执行结果:

result = add.delay(4, 6)
print(result.get())  # 输出:10

高级功能

定时任务

Celery支持定时任务,可以使用celery.beat模块实现。

以下示例展示了如何配置和使用定时任务:

from celery.schedules import crontab

app.conf.beat_schedule = {
    'add-every-30-seconds': {
        'task': 'myapp.add',
        'schedule': 30.0,
        'args': (16, 16)
    },
    'multiply-at-midnight': {
        'task': 'myapp.multiply',
        'schedule': crontab(hour=0, minute=0),
        'args': (4, 4),
    },
}

任务重试

Celery支持任务失败后的自动重试,可以通过任务的retry方法实现。

以下示例展示了如何配置任务重试:

@app.task(bind=True, max_retries=3)
def fragile_task(self):
    try:
        # 执行任务
        pass
    except Exception as exc:
        raise self.retry(exc=exc, countdown=5)

链接任务

Celery支持将多个任务链接在一起依次执行。

以下示例展示了如何链接任务:

from celery import chain

result = chain(add.s(4, 4) | add.s(8) | add.s(16))()
print(result.get())  # 输出:32

分组任务

Celery支持将多个任务分组并行执行。

以下示例展示了如何分组任务:

from celery import group

result = group(add.s(i, i) for i in range(10))()
print(result.get())  # 输出:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

使用中间件

Celery支持自定义中间件,用于在任务执行前后进行处理。

以下示例展示了如何使用中间件记录任务日志:

from celery.signals import before_task_publish, after_task_publish

@before_task_publish.connect
def task_sent_handler(sender=None, body=None, **kwargs):
    print(f'Task {sender} is sent with body {body}')

@after_task_publish.connect
def task_sent_handler(sender=None, body=None, **kwargs):
    print(f'Task {sender} has been sent')

实践应用

Web应用中的异步任务

在Web应用中,可以使用Celery处理耗时的任务,例如发送电子邮件:

# tasks.py
from celery import Celery

app = Celery('emailapp', broker='redis://localhost:6379/0')

@app.task
def send_email(to_address, subject, body):
    # 发送电子邮件的逻辑
    print(f"Sending email to {to_address} with subject '{subject}'")
# views.py
from flask import Flask, request, jsonify
from tasks import send_email

app = Flask(__name__)

@app.route('/send_email', methods=['POST'])
def send_email_endpoint():
    data = request.json
    send_email.delay(data['to_address'], data['subject'], data['body'])
    return jsonify({"status": "Email sent"}), 200

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

数据处理任务

使用Celery进行大规模数据处理任务:

# tasks.py
from celery import Celery
import pandas as pd

app = Celery('dataapp', broker='redis://localhost:6379/0')

@app.task
def process_data(file_path):
    df = pd.read_csv(file_path)
    summary = df.describe()
    output_path = file_path.replace('.csv', '_summary.csv')
    summary.to_csv(output_path)
    return output_path
# main.py
from tasks import process_data

result = process_data.delay('data.csv')
print(f"Summary file saved at: {result.get()}")

分布式爬虫

使用Celery构建分布式爬虫系统:

# tasks.py
from celery import Celery
import requests

app = Celery('crawlerapp', broker='redis://localhost:6379/0')

@app.task
def fetch_url(url):
    response = requests.get(url)
    return response.text
# main.py
from tasks import fetch_url

urls = ['https://example.com', 'https://example.org', 'https://example.net']
result = group(fetch_url.s(url) for url in urls)()
print(result.get())

总结

Celery库为Python开发者提供了一个强大且灵活的工具,用于管理异步任务队列和分布式任务执行。通过其简洁的API和丰富的功能,用户可以轻松地定义、调度和管理各种异步任务。无论是在Web开发、数据处理还是自动化任务中,Celery都能提供强大的支持和便利。

如果你觉得文章还不错,请大家 点赞、分享、留言 ,因为这将是我持续输出更多优质文章的最强动力!

更多Python学习内容:ipengtao.com


如果想要系统学习Python、Python问题咨询,或者考虑做一些工作以外的副业,都可以扫描二维码添加微信,围观朋友圈一起交流学习。

90b900be2b38ff201372700c9d64d6a0.gif

我们还为大家准备了Python资料和副业项目合集,感兴趣的小伙伴快来找我领取一起交流学习哦!

bf3ff8cf74bcf53e61c2b5ec2a8cd1c2.jpeg

往期推荐

Python 中的 iter() 函数:迭代器的生成工具

Python 中的 isinstance() 函数:类型检查的利器

Python 中的 sorted() 函数:排序的利器

Python 中的 hash() 函数:哈希值的奥秘

Python 中的 slice() 函数:切片的利器

Python 的 tuple() 函数:创建不可变序列

点击下方“阅读原文”查看更多

  • 29
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Celery是一个Python的分布式任务队列,可以处理大量的异步任务。它可以轻松地将任务分配给多个工作进程,并在完成后将结果返回到调用方。 以下是使用Celery处理异步任务的步骤: 1. 安装Celery 可以使用pip命令安装Celery: ```python pip install celery ``` 2. 创建Celery实例 在项目中创建一个Celery实例,可以使用以下代码: ```python from celery import Celery app = Celery('tasks', broker='pyamqp://guest@localhost//') ``` 该代码创建了一个名为“tasks”的Celery实例,使用“pyamqp://guest@localhost//”作为代理。 3. 定义任务 定义一个需要异步执行的任务,例如: ```python @app.task def add(x, y): return x + y ``` 该代码定义了一个名为“add”的任务,接受两个参数x和y,并返回它们的和。 4. 启动工作进程 使用以下命令启动工作进程: ```python celery -A tasks worker --loglevel=info ``` 该命令将启动一个名为“tasks”的Celery应用程序,并使用默认的代理。 5. 调用任务 现在可以调用“add”任务,例如: ```python result = add.delay(4, 4) ``` 该代码将启动一个异步任务,将参数4和4传递给“add”任务,并返回一个AsyncResult对象。 6. 获取任务结果 可以使用以下代码获取任务结果: ```python result = add.delay(4, 4) result.wait() ``` 该代码将等待异步任务完成,并返回任务结果。 以上就是使用Celery处理异步任务的基本步骤。使用Celery还有其他高级功能,例如定时任务任务重试、任务结果存储等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值