python使用异步任务celery出现异常崩溃时retry重试

文章提供了源地址,为http://xiaorui.cc/?p=254 。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章源地址,http://xiaorui.cc/?p=254

Python 中,Celery 是一个广泛使用的分布式任务队列库,而 Redis 常作为消息代理(broker)来支持 Celery任务调度和执行。以下是 Celery 与 Redis 集成的配置和使用方法。 ### 安装必要的依赖 首先,确保安装了 `celery` 和 `redis` 的相关依赖: ```bash pip install celery redis ``` 如果使用 Redis 作为 Celery 的 Broker,需要确保 Redis 服务器已安装并运行。可以通过以下命令安装 Redis: ```bash # Ubuntu sudo apt-get install redis-server # macOS (使用 Homebrew) brew install redis ``` ### 配置 Celery 与 Redis 创建一个 `celery.py` 文件来配置 Celery 实例: ```python from celery import Celery # 创建 Celery 实例,指定 Redis 作为 Broker app = Celery('tasks', broker='redis://localhost:6379/0') # 配置可选 app.conf.update( result_backend='redis://localhost:6379/0', # 结果存储也使用 Redis task_serializer='json', accept_content=['json'], # 允许的序列化类型 result_serializer='json', timezone='UTC', enable_utc=True, ) ``` ### 定义任务 创建一个 `tasks.py` 文件,定义一个简单的任务: ```python from celery import shared_task @shared_task def add(x, y): return x + y ``` ### 启动 Celery Worker 在终端中启动 Celery worker 来执行任务: ```bash celery -A tasks worker --loglevel=info ``` ### 调用任务 可以通过以下方式调用任务并获取结果: ```python from tasks import add # 异步调用任务 result = add.delay(4, 4) # 获取任务结果 print(result.get(timeout=10)) # 输出 8 ``` ### 监控任务状态 可以使用 `AsyncResult` 来检查任务的状态: ```python from celery.result import AsyncResult task_id = result.id async_result = AsyncResult(task_id) print(async_result.state) # 查看任务状态,如 'PENDING', 'STARTED', 'SUCCESS' ``` ### Redis 作为结果后端 Celery 支持将任务结果存储到 Redis 中,这在需要异步获取任务结果非常有用。配置 `result_backend` 为 Redis 地址即可启用此功能: ```python app.conf.update( result_backend='redis://localhost:6379/0', ) ``` ### Celery Beat 调度周期任务 如果需要周期性地执行任务,可以使用 Celery Beat。配置 `beat_schedule` 来定义周期任务: ```python from celery.schedules import crontab app.conf.beat_schedule = { 'add-every-30-seconds': { 'task': 'tasks.add', 'schedule': 30.0, # 每 30 秒执行一次 'args': (1, 1) }, } ``` 启动 Celery Beat: ```bash celery -A tasks beat --loglevel=info ``` ### 常见问题与优化 1. **Redis 连接问题**:确保 Redis 服务已启动,并且 Celery 配置中的地址和端口正确。 2. **任务**:对于长间运行的任务,适当调整 `result.get(timeout=...)` 的超间。 3. **任务重试**:可以在任务使用 `autoretry_for` 和 `retry_kwargs` 来配置自动重试机制。 4. **性能优化**:根据任务负载调整 `worker_concurrency` 参数以提高并发处理能力。 ### 示例代码 ```python # tasks.py from celery import shared_task @shared_task def add(x, y): return x + y ``` ```bash # 启动 Celery Worker celery -A tasks worker --loglevel=info ``` ```bash # 启动 Celery Beat celery -A tasks beat --loglevel=info ``` ```python # 调用任务 from tasks import add result = add.delay(4, 4) print(result.get(timeout=10)) # 输出 8 ``` 通过以上步骤,可以顺利地将 Celery 与 Redis 集成,并实现任务队列的配置和使用[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值