Django+Celery 進階:Celery可視化監控與排錯
一、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從入門到實戰》專欄!關注不迷路~

本文介紹了Celery命令行工具與圖形監控工具的使用,涵蓋查看Worker狀態、任務信息及集成至Django項目的方法,同時提供Redis監控與常見問題排錯方案。
浙公網安備 33010602011771號