一、Celery 命令行工具

Celery 命令行工具可用去查看Celery的运行状态。打开一个终端窗口,进入项目目录(与manage.py同级),运行以下命令

  • 列出集群中在线的Celery Worker节点
celery -A mysite status

### 大概10秒后,输出结果
-> celery@DESKTOP-MHHVBI3: OK 1 node online.
  • 列出正在执行的Celery 任务
celery -A mysite inspect active

### 输出结果
-> celery@DESKTOP-MHHVBI3: OK
- empty - 1 node online.
  • 列出已注册的Celery 任务
celery -A mysite inspect registered

### 输出结果示例
-> celery@DESKTOP-MHHVBI3: OK
* myapp_infra.tasks.cleanup_expired_data
* myapp_infra.tasks.send_daily_report
* myapp_system.tasks.login_log_task
* myapp_system.tasks.operation_log_task
* myapp_system.tasks.send_single_mail_task 1 node online.
  • 显示Celery 统计数据
celery -A mysite inspect stats 

### 输出结果示例
-> celery@DESKTOP-MHHVBI3: OK
{
"broker": {
"alternates": [],
"connect_timeout": 4,
"failover_strategy": "round-robin",
"heartbeat": 0,
"hostname": "127.0.0.1",
"insist": false,
"login_method": null,
"port": 6379,
"ssl": false,
"transport": "redis",
"transport_options": {},
"uri_prefix": null,
"userid": null,
"virtual_host": "3"
},
"clock": "543",
"pid": 2316,
"pool": {
"implementation": "celery.concurrency.solo:TaskPool",
"max-concurrency": 1,
"max-tasks-per-child": null,
"processes": [
2316
],
"put-guarded-by-semaphore": true,
"timeouts": []
},
"prefetch_count": 32,
"rusage": "N/A",
"total": {
"myapp_infra.tasks.cleanup_expired_data": 3,
"myapp_system.tasks.login_log_task": 36
},
"uptime": 541
} 1 node online.

小结:

  • 以上命令支持 --timeout参数,例如在命令后加上--timeout 3
  • 参考资料:Celery 监控

二、Celery 图形监控

Celery Flower 图形监控

Celery Flower 是一个用于监控和管理 Celery 任务的开源 Web 应用程序,它提供了实时的任务状态监控、任务执行图表、工作者信息、任务追踪和任务日志等功能。

安装

pip install flower

基本使用

Celery Flower 服务启动命令:进入根目录(包含manage.py文件的目录)执行

celery -A mysite flower --port=5555

访问 http://<IP>:5555 查看Celery 图形监控

  • 点击 Workers 查看 Celery Worker 状态

  • 点击 Tasks 查看当前及后来的任务(不会显示以前的任务)。另外,通过观察任务列表的变化,判断 Celery Beat 的状态是否正常。

  • 点击 Broker 查看 Redis 状态

与Django项目集成

对于Django+Vue3的前后端分离项目,使用iframe(内联框架) HTML 元素,可将网页嵌入其他网页。实现将Celery Flower 集成到Django项目中。

点击查看集成代码示例

三、Redis 图形监控

Redis一般作为Celery的消息中间件 (Broker),负责接收任务生产者发送的消息并将任务存入队列。

安装工具:Another Redis Desktop Manager,是一个Redis的图形管理界面工具。下载地址

解压即可使用。连接Redis 服务器后,查看celery队列中的任务数。

  • 如果没有celery键,表示当前没有等待的Celery任务

四、Celery 排错

PermissionError权限错误

错误信息

[2025-04-12 22:53:48,435: INFO/MainProcess] Task tasks.add[6d0cc2d2-0a84-4a4d-b5e7-e86a4bd9b625] received
[2025-04-12 22:53:48,436: ERROR/SpawnPoolWorker-6] Pool process <billiard.pool.Worker object at 0x0000027D686A33D0> error: PermissionError(13, '拒绝访问。', None, 5, None)
Traceback (most recent call last):

解决方法

# 在Windows系统中,prefork 多进程模式可能导致权限冲突。改用单进程模式启动--pool=solo
celery -A tasks worker --loglevel=INFO --pool=solo

AppRegistryNotReady 错误

错误信息

2025-05-17 18:33:13,886 INFO D:\workspace_python\mars-mgn\mysite\myapp_system\tasks.py changed, reloading.
Traceback (most recent call last):
...
File "D:\workspace_python\mars-mgn\venv\Lib\site-packages\django\apps\registry.py", line 138, in check_apps_ready
raise AppRegistryNotReady("Apps aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

解决方法

  • 分析:Celery初始化与Django启动顺序问题:在celery.py中通过app.autodiscover_tasks()自动发现任务时,可能过早加载包含Django模型的任务模块,而Django的INSTALLED_APPS尚未完全初始化
  • 避免在任务模块顶部直接导入Django模型。将模型导入操作移至任务函数内部
# myapp_system/tasks.py
from celery import shared_task
from django.core.mail import send_mail @shared_task
def send_email_task(subject, message, from_email, recipient_list):
# 导入操作移至任务函数内部:延迟导入模型和序列化器
from .mail_log.serializers import MailLogSaveSerializer
from .models import SystemMailLog # 发送邮件逻辑
send_mail(subject, message, from_email, recipient_list)
return "邮件发送成功"

任务参数

错误信息

celery.beat.SchedulingError: Couldn't apply scheduled task daily_cleanup_expired_data: cleanup_expired_data() takes 0 positional arguments but 1 was given

解决方法

  • 分析:args 和 kwargs 参数是传递给任务。若定义任务时没有定义接收参数,但却传递了arsg或kwargs参数,则Celery Beat 会报错
  • 修改任务定义的代码,然后重启Celery worker和 beat。

时区

建议使用统一的时区,例如全部统一为东八区

  • settings.py 中明确配置
# 设置 Django 时区
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = True # 配置 Celery 时区
CELERY_TIMEZONE = 'Asia/Shanghai' # MySQL数据库连接字符串中添加时区参数
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
# ...
"OPTIONS": {"init_command": "SET time_zone='+08:00'"},
}
}
  • Celery Worker 所在服务器系统时区为
# 查看系统时区
timedatectl | grep "Time zone"
# 设置时区
timedatectl set-timezone Asia/Shanghai

您正在阅读的是《Django从入门到实战》专栏!关注不迷路~

Django+Celery 进阶:Celery可视化监控与排错的更多相关文章

  1. Python—在Django中使用Celery

    一.Django中的请求 Django Web中从一个http请求发起,到获得响应返回html页面的流程大致如下: http请求发起 经过中间件 http handling(request解析) ur ...

  2. Django 中使用 Celery

    起步 在 <分布式任务队列Celery使用说明> 中介绍了在 Python 中使用 Celery 来实验异步任务和定时任务功能.本文介绍如何在 Django 中使用 Celery. 安装 ...

  3. Django中使用Celery

    一.前言 Celery是一个基于python开发的分布式任务队列,如果不了解请阅读笔者上一篇博文Celery入门与进阶,而做python WEB开发最为流行的框架莫属Django,但是Django的请 ...

  4. Celery进阶

    Celery进阶 在你的应用中使用Celery 我们的项目 proj/__init__.py   /celery.py   /tasks.py 1 # celery.py 2 from celery ...

  5. Django 如何使用 Celery 完成异步任务或定时任务

    以前版本的 Celery 需要一个单独的库(django-celery)才能与 Django 一起工作, 但从 Celery 3.1 开始,情况便不再如此,我们可以直接通过 Celery 库来完成在 ...

  6. 为django项目配置celery的后台启动

    为root用户启动celery创建的脚本,该脚本的拥有者与使用者都必须是root .使用方法为 /etc/init.d/celeryd [start]|[stop]|[kill] 需增加两个文件 /e ...

  7. Django 1.9 + celery + django-celry 实现定时任务

    celery可以进行任务异步处理,celery还有一种Celery的常用模式便是执行定期任务. 执行定期任务时, Celery会通过celerybeat进程来完成. Celerybeat会保持运行, ...

  8. Django中使用Celery实现定时任务(用djcelery)

    一.引言 Django是python语言下的一个比较热门的Web框架,越来越多的企业和开发者使用Django实现自己的Web服务器.在Web服务器开发过程中,有时候我们不仅仅是要实现Web服务器端和用 ...

  9. Celery学习---Celery 与django结合实现计划任务功能

    项目的目录结构: 项目前提: 安装并启动Redis 安装Django和Celery的定时任务插件 安装方法一: pip直接安装[安装了pip的前提下] omc@omc-virtual-machine: ...

  10. Celery学习--- Celery 最佳实践之与django结合实现异步任务

    django 可以轻松跟celery结合实现异步任务,只需简单配置即可 同步执行和异步执行 注意:即使Celery的任务没有执行完成,但是已经创建了任务ID.可以利用前台的定时任务发送Ajax异步请求 ...

随机推荐

  1. Yuque Rich Text(语雀富文本编辑器)

    Yuque Rich Text(语雀富文本编辑器) 由于本人觉得语雀编辑器非常好用,很符合我的使用习惯,然后发现语雀的Chrome浏览器插件实现了编辑器的功能,所以将其富文本的功能拆分位一个单独的Vu ...

  2. 容器原理之cgroup

    " 以 docker 为代表,轻量.便携的 container 使得打包和发布应用非常容易.系列文章容器原理主要分析 container 用到的核心技术,主要包括 Linux namespa ...

  3. [VulnHub]DC-1靶场全过程

    DC-1 借鉴我们OnePanda-Sec团队的文章 https://mp.weixin.qq.com/s/BbPkmDiZ-cRleiCqmj114w 靶场搭建 先导入DC-1靶场,并将连接改为NA ...

  4. EFCore(五)——多个DBContext的Code First指定对应的DBContext更新

    此环境为ASP.NET Core的项目 1.在需要更新的DBContext里添加空的构造函数 2.打开Nuget命令行选择对应的目录位置 3.带参数-Context指定对应的DBContext 1.  ...

  5. 6.4K star!轻松搞定专业领域大模型推理,这个知识增强框架绝了!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 「垂直领域大模型落地难?逻辑推理总出错?这个来自OpenSPG的开源框架,让专业领域知识服务 ...

  6. SQL 日常练习 (十六)

    最近接触了一波 RPA, 可以用来做一些数据采集的事情, 或者任意控制电脑上的软件, 感觉上是挺厉害的, 但我就是不想用, 尽管我尝试了一波, 最后还是放弃 了, 我还是喜欢纯代码的工作方式, 最为讨 ...

  7. Python实验4 列表与字典应用

    目的 :熟练操作组合数据类型. 试验任务: 基础:生日悖论分析.如果一个房间有23 人或以上,那么至少有两 个人的生日相同的概率大于50%.编写程序,输出在不同随机样本数 量下,23 个人中至少两个人 ...

  8. WebAssembly:开启新时代的跨平台

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  9. Win32汇编学习笔记03.RadAsm和补丁

    https://bpsend.net/thread-163-1-1.html 补丁 扫雷游戏啊下补丁 在扫雷游戏中,点关闭弹出一个确认框,确认之后再关闭,取消就不关闭 首先第一步就是确认关闭按钮响应的 ...

  10. 【2020.11.30提高组模拟】柱形图(histogram) 题解翻译

    [2020.11.30提高组模拟]柱形图(histogram) 题解 题意简述 有\(n\)个长方体并排这样放着,每种颜色的长方体的宽度都为\(1\),高\(a_i\)长\(b_i\). 求在这些长方 ...