文章目录
- 可以并行执行多个任务,并在所有任务完成后获取结果。 from celery import group group_tasks = group(task1.s(arg1), task2.s(arg2), task3.s(arg3)) result = group_tasks.apply_async()
- 任务链可以将多个任务串联起来,形成顺序执行的工作流。 from celery import chain workflow = chain(task1.s(arg1) | task2.s(arg2) | task3.s(arg3)) result = workflow.apply_async()
- Chords 是 Group 和 Chain 的结合,允许在一组任务完成后执行一个回调任务。 from celery import chord workflow = chord( [task1.s(arg1), task2.s(arg2)], callback_task.s() ) result = workflow.apply_async()
- 使用 celery-beat 配置周期性任务: from celery import Celery from celery.schedules import crontab app = Celery(‘my_app’) app.conf.beat_schedule = { ‘add-every-10-seconds’: { ‘task’: ‘my_app.tasks.add’, ‘schedule’: 10.0, ‘args’: (16, 16), }, ‘daily-task’: { ‘task’: ‘my_app.tasks.daily_report’, ‘schedule’: crontab(hour=7, minute=30), }, }
- 通过 celery-beat 的数据库支持,可以动态增删或更新任务调度。 from django_celery_beat.models import PeriodicTask, IntervalSchedule # 创建新调度 schedule, created = IntervalSchedule.objects.get_or_create( every=10, period=IntervalSchedule.SECONDS, ) PeriodicTask.objects.create( interval=schedule, name=’new_task’, task=’my_app.tasks.some_task’, args=json.dumps([10, 20]), )
目录
- 一、任务重试机制
- 二、任务分组与工作流
- 1.任务分组 (Group)
- 2.任务链 (Chain)
- 3.Chords
- 三、动态任务优先级
- 四、定时任务与动态调度
- 1. 配置定时任务
- 2. 动态更新调度
- 五、任务结果的持久化与清理
- 六、监控与优化
- 1. 使用 Flower 实时监控
- 2. 性能优化建议
- 结语
Celery 是一个功能强大且灵活的分布式任务队列,它常用于异步任务执行和定时任务调度。在实际项目中,除了基本的任务执行,Celery 还提供了许多高级特性,可以帮助开发者优化性能、增强稳定性以及满足复杂业务需求。本文将探讨 Celery 的一些高级用法,带你解锁其更多潜力。
在分布式任务系统中,任务可能因为临时性问题(如网络波动或服务不可用)而失败。Celery 提供了内置的任务重试机制,可以通过以下方式实现:
from celery import shared_task
from celery.exceptions import Retry
@shared_task(bind=True, max_retries=3, default_retry_delay=5)
def fetch_data(self, url):
try:
response = requests.get(url)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as exc:
# 如果失败则重试
raise self.retry(exc=exc)
max_retries: 最大重试次数。default_retry_delay: 每次重试之间的延迟时间(秒)。self.retry: 手动触发任务重试,可以动态调整重试时间或抛出异常。
Celery 支持对任务进行分组或串行化,从而构建复杂的工作流。这可以通过以下几种方式实现:
可以并行执行多个任务,并在所有任务完成后获取结果。
from celery import group group_tasks = group(task1.s(arg1), task2.s(arg2), task3.s(arg3)) result = group_tasks.apply_async()
任务链可以将多个任务串联起来,形成顺序执行的工作流。
from celery import chain workflow = chain(task1.s(arg1) | task2.s(arg2) | task3.s(arg3)) result = workflow.apply_async()
Chords 是 Group 和 Chain 的结合,允许在一组任务完成后执行一个回调任务。
from celery import chord
workflow = chord(
[task1.s(arg1), task2.s(arg2)],
callback_task.s()
)
result = workflow.apply_async()
通过设置任务的优先级,可以让重要任务优先执行。Celery 中的任务优先级与消息队列的支持相关,以下是使用 RabbitMQ 的示例:
@shared_task(priority=1)
def high_priority_task():
# 高优先级任务逻辑
pass
@shared_task(priority=10)
def low_priority_task():
# 低优先级任务逻辑
pass
- RabbitMQ 支持 0-255 的优先级值,数值越低优先级越高。
- 配置消息队列时需启用
x-max-priority属性:
task_queues:
- name: my_queue
exchange: my_exchange
routing_key: my_key
queue_arguments:
x-max-priority: 10
Celery 配合 celery-beat 可以轻松实现定时任务调度。此外,通过动态修改调度配置,可以实现更灵活的任务管理。
使用 celery-beat 配置周期性任务:
from celery import Celery
from celery.schedules import crontab
app = Celery('my_app')
app.conf.beat_schedule = {
'add-every-10-seconds': {
'task': 'my_app.tasks.add',
'schedule': 10.0,
'args': (16, 16),
},
'daily-task': {
'task': 'my_app.tasks.daily_report',
'schedule': crontab(hour=7, minute=30),
},
}
通过 celery-beat 的数据库支持,可以动态增删或更新任务调度。
from django_celery_beat.models import PeriodicTask, IntervalSchedule
# 创建新调度
schedule, created = IntervalSchedule.objects.get_or_create(
every=10,
period=IntervalSchedule.SECONDS,
)
PeriodicTask.objects.create(
interval=schedule,
name='new_task',
task='my_app.tasks.some_task',
args=json.dumps([10, 20]),
)
Celery 默认使用 backend 存储任务结果。对于长期运行的系统,管理任务结果存储至关重要:
- 配置结果过期时间:
app.conf.result_expires = 3600 # 结果在 1 小时后过期
- 手动清理结果:
celery -A my_app purge
监控任务队列是保证系统稳定运行的重要部分。
Flower 是 Celery 的一个实时监控工具,可以帮助开发者可视化任务执行状态。
pip install flower celery -A my_app flower
访问 http://localhost:5555 查看监控页面。
- 任务粒度控制: 避免任务过大,导致超时或难以重试。
- 异步 I/O 优先: 在任务中尽量使用异步操作,提升性能。
- 队列分离: 为不同优先级或类型的任务配置独立的队列。
Celery 是一个高效且可扩展的任务队列框架,掌握其高级用法能够帮助开发者更好地应对复杂场景的挑战。通过合理配置任务重试、分组工作流、优先级管理以及监控工具,可以显著提升系统的可靠性和性能。在实际应用中,建议结合具体业务需求,灵活运用这些特性,充分释放 Celery 的潜力。
到此这篇关于python中Celery 异步任务队列的高级用法的文章就介绍到这了,更多相关python Celery 异步队列内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- Python中Celery异步任务队列的具体使用
- python使用Celery构建异步任务队列提高服务器吞吐量及响应速度
- python库Celery异步发送电子邮件定时生成报告实战示例
- Python分布式异步任务框架Celery使用教程
- python中使用Celery容联云异步发送验证码功能
- python3中celery异步框架简单使用+守护进程方式启动
- Python Celery异步任务队列使用方法解析
- python基于celery实现异步任务周期任务定时任务
- python使用celery实现异步任务执行的例子
- Python环境下安装使用异步任务队列包Celery的基础教程