Django
中间件:概述
中间件:自定义
Celery(一)
内置应用的作用
内置中间件的作用
Celery(二)
模型 class Meta
模型 管理器(Manager)
related_name 介绍
prefetch_related 介绍
本文档使用 MrDoc 发布
-
+
首页
Celery(一)
### Celery的作用 - **异步任务** - **延时任务** - **定时任务** ``` @app.task def send_sms(): time.sleep(1) print('短信发送成功') # 1. 异步任务 send_sms.delay(code, mobile) # 2. 延时任务 eta = datetime.utcnow() + timedelta(seconds=30) res = send_sms.apply_async(args=(18953675221,), eta=eta) # 3. 定时任务 app.conf.beat_schedule = { 'update_duanxin': { # 'task': 'celery_task.user_task.send_tx_duanxin', 'task': 'celery_task.user_task.send_tx_duanxin', 'schedule': timedelta(minutes=2), 'args': (), }, } ``` ### Celery的一些配置参数 - `CELERY_QUEUES` 用于定义应用程序中使用的队列。通过这个配置,开发者可以创建多个队列,以便根据任务的类型或优先级将任务分发到不同的队列中。 - `CELERY_ROUTES` 用于定义如何将任务路由到不同的队列。通过配置路由,开发者可以指定特定的任务应该发送到哪个队列,从而实现更细粒度的控制。 - `CELERY_BEAT_SCHEDULE` 是 Celery 中用于配置定时任务的参数。`Celery Beat` 是一个调度器,它会定期发送任务到任务队列。通过 `CELERY_BEAT_SCHEDULE`,你可以定义何时执行特定的任务,包括周期性执行的任务。 ### 使用案例 ``` from celery import Celery from kombu import Queue from celery.schedules import crontab app = Celery('my_project') app.conf.task_queues = ( Queue('default', routing_key='task.#'), Queue('low_priority', routing_key='low_priority.#'), Queue('high_priority', routing_key='high_priority.#'), ) app.conf.task_routes = { 'my_app.tasks.default_task': {'queue': 'default'}, 'my_app.tasks.low_priority_task': {'queue': 'low_priority'}, 'my_app.tasks.high_priority_task': {'queue': 'high_priority'}, } app.conf.beat_schedule = { 'run-every-30-seconds': { 'task': 'my_app.tasks.my_periodic_task', 'schedule': 30.0, # 每30秒执行一次 }, 'run-every-morning': { 'task': 'my_app.tasks.my_morning_task', 'schedule': crontab(hour=7, minute=30), # 每天早上7:30执行 }, } ``` ### 启动命令 ``` # 启动定时任务调度器 celery -A my_project beat # 启动默认队列的worker celery -A my_project worker -Q default --loglevel=info # 启动`low_priority`队列的worker celery -A my_project worker -Q low_priority --loglevel=info # 启动`high_priority`队列的worker celery -A my_project worker -Q high_priority --loglevel=info ``` 你还可以为每个worker指定名称、并发数等选项,以下是一个示例: ``` celery -A my_project worker -Q high_priority --loglevel=info \ --concurrency=4 --name=high_priority_worker ``` ### Celery 监控 你可以使用 Celery 的监控工具(如 Flower)来监控各个 worker 的状态和性能 ``` pip install flower celery -A my_project flower ``` ### 为什么要定义多个队列 >d 往往在生产环境中可能有大量的异步任务需要执行,不同的任务所需要的资源和时间不一样的。为了防止一些非常耗时的任务阻塞任务队列导致一些简单任务也无法执行,这时候就需要对任务队列Queue进行合理的划分,将不同任务交由不同的Queue处理。 在使用 Celery 的过程中,定义多个队列(通过 CELERY_QUEUES 配置)有许多好处,主要包括以下几点: 1. `任务优先级管理` 通过定义多个队列,你可以根据任务的优先级将它们分配到不同的队列中。例如,可以创建一个高优先级队列和一个低优先级队列。高优先级的任务会被优先处理,从而提高系统的响应能力和吞吐量。 2. `资源分配` 不同的队列可以绑定到不同的工作进程或 worker。这样,你可以根据任务的需求分配不同的资源。例如,CPU 密集型任务可以分配到专门的队列和 worker,而 I/O 密集型任务可以分配到另一组 worker。这有助于优化系统性能。 3. `任务隔离` 使用多个队列可以实现任务的隔离。例如,某些任务可能需要较长的处理时间,而其他任务则可能需要快速响应。通过将这些任务分配到不同的队列中,可以防止长时间运行的任务影响短时间任务的执行。 4. `灵活性与可维护性` 在大型应用中,任务的类型和数量可能会不断增加。通过使用多个队列,可以更容易地组织和管理这些任务,保持代码的清晰和模块化。这使得维护和扩展应用变得更加简单。 5. `更好的监控与管理` 通过多个队列,可以更容易地监控不同类型任务的执行情况,比如任务失败率、处理时间等。这有助于快速识别和解决性能瓶颈或其他问题。 6. `动态任务路由` 结合 `CELERY_ROUTES`,你可以根据任务的特征动态地将任务路由到不同的队列。这种灵活性使得可以根据当前负载和其他条件调整任务的处理方式。
gaojian
2024年9月10日 18:56
分享文档
收藏文档
上一篇
下一篇
微信扫一扫
复制链接
手机扫一扫进行分享
复制链接
关于 MrDoc
觅思文档MrDoc
是
州的先生
开发并开源的在线文档系统,其适合作为个人和小型团队的云笔记、文档和知识库管理工具。
如果觅思文档给你或你的团队带来了帮助,欢迎对作者进行一些打赏捐助,这将有力支持作者持续投入精力更新和维护觅思文档,感谢你的捐助!
>>>捐助鸣谢列表
微信
支付宝
QQ
PayPal
Markdown文件
分享
链接
类型
密码
更新密码