多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

【python】【celery】

【python】【celery】 Celery 是一个强大的异步任务队列框架常与 Django 结合使用用于处理耗时任务、定时任务及分布式任务提升系统响应速度与扩展性。这里为你呈现不同场景下的 Celery 相关图片Celery 核心架构图Django 项目中 Celery 的配置代码示例Celery 任务执行流程示意图Celery 任务运行日志示例 Django Celery 入门教程Celery 是一个简单、灵活且可靠的分布式任务队列系统专注于实时处理的异步任务队列同时也支持任务调度。在 Django 中集成 Celery可以有效解决耗时任务如邮件发送、文件处理、AI 计算等阻塞 HTTP 请求的问题。1. 核心架构与工作流程Celery 的工作流程可以概括为任务生产者Django 视图将任务发送到消息队列Broker。消息队列如 Redis存储任务直到任务消费者获取它们。任务执行单元Worker从队列中取出任务并执行。执行完成后任务结果存储到结果存储后端Backend。2. 环境准备与安装首先需要安装 Celery 和消息中间件以 Redis 为例pipinstallcelery redis生产环境建议使用 Linux 平台Windows 平台仅适用于开发或测试环境。3. Django 项目配置假设你的 Django 项目名为mysite需要进行以下配置步骤一创建celery.py在mysite/mysite/目录下新建celery.py文件importosfromceleryimportCelery os.environ.setdefault(DJANGO_SETTINGS_MODULE,mysite.settings)appCelery(mysite)# 加载配置文件中的 Celery 配置namespaceCELERY 表示配置项以 CELERY_ 开头app.config_from_object(django.conf:settings,namespaceCELERY)# 自动发现并加载所有已安装应用中的 tasks.pyapp.autodiscover_tasks()步骤二修改__init__.py修改mysite/mysite/__init__.py确保 Django 启动时加载 Celery 实例from.celeryimportappascelery_app __all__(celery_app,)步骤三配置settings.py在settings.py中添加 Celery 相关配置CELERY_BROKER_URLredis://localhost:6379/0# 消息中间件地址CELERY_RESULT_BACKENDredis://localhost:6379/1# 结果存储地址CELERY_TIMEZONEAsia/Shanghai# 时区设置4. 编写并调用异步任务在具体的 App如myapp中创建tasks.py文件使用shared_task装饰器定义任务fromceleryimportshared_taskfromtimeimportsleepshared_taskdefsend_email_task(subject,message):print(发送邮件任务开始执行...)sleep(3)# 模拟耗时操作print(f邮件发送成功:{subject})在视图或其他代码中使用.delay()方法将任务发送到队列中异步执行frommyapp.tasksimportsend_email_task# 在视图中调用send_email_task.delay(Hello Celery,这是一封测试邮件)5. 启动 Celery Worker在项目根目录下运行以下命令启动 Worker 进程celery-Amysite worker--loglevelinfo如果需要执行定时任务还需启动 Beat 调度器celery -A mysite beat --loglevelinfo。 高级实战案例与避坑指南在掌握了基础配置后实际生产环境中还需要处理复杂的业务场景、高并发优化以及潜在的坑点。1. 数据库事务与任务执行顺序陷阱问题在 Django 视图中创建数据后立即触发 Celery 任务由于数据库事务尚未提交Worker 可能会在数据库中查不到该数据。解决方案使用transaction.on_commit()钩子或者在 Celery 5.4 版本中使用更简洁的delay_on_commit()方法fromdjango.dbimporttransaction# 方案 A传统方式transaction.on_commit(lambda:send_email.delay(user.pk))# 方案 BCelery 5.4 推荐方式send_email.delay_on_commit(user.pk)2. 动态定时任务与持久化默认的 Celery Beat 配置存储在内存中重启后会丢失。生产环境应使用django-celery-beat将定时任务持久化到数据库pipinstalldjango-celery-beat django-celery-results在settings.py中配置INSTALLED_APPS[...,django_celery_beat,django_celery_results]CELERY_BEAT_SCHEDULERdjango_celery_beat.schedulers:DatabaseScheduler执行python manage.py migrate django_celery_beat后即可通过 Django Admin 或 DRF 接口动态增删改查定时任务无需重启服务。3. 任务重试与错误处理机制为了保证系统的健壮性任务应当具备重试机制和完善的日志记录fromcelery.utils.logimportget_task_logger loggerget_task_logger(__name__)shared_task(bindTrue,max_retries3)defprocess_data(self,data):try:# 处理数据逻辑passexceptExceptionase:logger.error(f任务执行失败{str(e)},exc_infoTrue)# 60秒后重试self.retry(exce,countdown60)4. 高并发与分布式架构优化面对海量请求可以从以下维度进行优化任务队列分片通过路由键Routing Key实现任务负载均衡将关键任务和普通任务路由到不同的优先级队列中。并发数调整根据服务器 CPU 核心数合理设置 Worker 的并发数celery -A proj worker --concurrency4。内存泄漏防范设置 Worker 的最大任务数限制防止内存持续增长celery -A proj worker --max-tasks-per-child100。进程管理生产环境务必使用 Supervisor 或 Systemd 来管理 Celery Worker 和 Beat 进程确保进程崩溃后能自动重启。5. 监控与排查使用Flower进行可视化监控pip install flower运行celery -A mysite flower可在http://localhost:5555查看任务队列长度、执行状态等。结合Prometheus Grafana搭建监控体系对 Celery 队列长度、API 响应时间、系统 CPU/内存等关键指标进行告警。在生产环境中使用 Supervisor 来守护 Celery 进程是非常标准且必要的做法。为了保证系统的稳定性通常建议将Celery Worker负责执行任务和Celery Beat负责定时调度分为两个独立的进程进行配置。以下是一份完整的 Supervisor 配置示例及部署步骤1. 安装 Supervisor首先确保在你的系统上安装了 Supervisorsudoapt-getinstallsupervisor# Ubuntu/Debian 系统# 或pipinstallsupervisor# 通过 pip 安装2. 编写配置文件在 Supervisor 的配置目录下例如/etc/supervisor/conf.d/或项目目录下的config/文件夹创建一个配置文件例如celery.conf; ; 1. Celery Worker 进程配置 ; [program:celery_worker] ; 启动命令注意生产环境强烈建议使用虚拟环境的绝对路径 command/path/to/your/project/venv/bin/celery -A myproject worker -l info -c 4 --max-tasks-per-child100 ; 项目根目录 directory/path/to/your/project ; 运行进程的用户避免使用 root userwww-data ; 随 Supervisor 自动启动 autostarttrue ; 进程崩溃或退出后自动重启 autorestarttrue ; 将标准错误重定向到标准输出 redirect_stderrtrue ; 日志文件路径需提前创建目录 stdout_logfile/var/log/celery/worker.log ; ; 2. Celery Beat 调度器配置 ; [program:celery_beat] command/path/to/your/project/venv/bin/celery -A myproject beat -l info directory/path/to/your/project userwww-data autostarttrue autorestarttrue redirect_stderrtrue stdout_logfile/var/log/celery/beat.log3. 配置参数说明command: 启动 Celery 的命令。-A myproject指定你的 Django 项目实例名称-c 4设置并发数建议根据 CPU 核心数调整--max-tasks-per-child100限制每个 Worker 处理 100 个任务后重启有效防止内存泄漏。directory: 必须指向你的 Django 项目根目录确保 Celery 能正确加载模块。user: 指定运行进程的系统用户提升安全性。autostart autorestart: 确保服务开机自启并在异常退出时自动恢复。4. 启动与管理命令配置完成后执行以下命令使配置生效并启动服务# 1. 确保日志目录存在sudomkdir-p/var/log/celery# 2. 重新读取配置文件sudosupervisorctl reread# 3. 应用配置并启动进程sudosupervisorctl update# 4. 查看进程运行状态sudosupervisorctl status日常运维常用命令重启 Workersudo supervisorctl restart celery_worker停止 Beatsudo supervisorctl stop celery_beat查看实时日志tail -f /var/log/celery/worker.log通过以上配置 Celery 服务将具备极高的可用性即使遇到代码异常或服务器重启也能自动恢复运行。
返回列表