198 lines
6.1 KiB
Python
198 lines
6.1 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
清空 Celery 队列中的所有消息
|
|
|
|
这个脚本会删除 Redis 中 Celery 队列的所有待处理任务
|
|
"""
|
|
|
|
import redis
|
|
from app.core.config import settings
|
|
from app.celery_app import celery_app
|
|
|
|
|
|
def clear_celery_queue():
|
|
"""清空 Celery 队列"""
|
|
print("🗑️ 清空 Celery 队列")
|
|
print("=" * 50)
|
|
|
|
try:
|
|
# 连接到 Redis
|
|
redis_client = redis.Redis(
|
|
host=settings.REDIS_HOST,
|
|
port=settings.REDIS_PORT,
|
|
password=settings.REDIS_PASSWORD,
|
|
db=settings.CELERY_BROKER,
|
|
decode_responses=True
|
|
)
|
|
|
|
# 测试连接
|
|
redis_client.ping()
|
|
print("✅ Redis 连接成功")
|
|
|
|
# 队列名称
|
|
queue_name = 'localhost_test_wyl'
|
|
|
|
# 获取队列长度
|
|
queue_length = redis_client.llen(queue_name)
|
|
print(f"📊 队列 '{queue_name}' 当前长度: {queue_length}")
|
|
|
|
if queue_length == 0:
|
|
print("✅ 队列已经是空的,无需清理")
|
|
return
|
|
|
|
# 确认清空
|
|
print(f"\n⚠️ 警告: 即将删除 {queue_length} 个待处理任务")
|
|
confirm = input("确认清空队列? (yes/no): ").strip().lower()
|
|
|
|
if confirm not in ['yes', 'y']:
|
|
print("❌ 操作已取消")
|
|
return
|
|
|
|
# 删除队列
|
|
deleted_count = redis_client.delete(queue_name)
|
|
print(f"✅ 已删除队列,删除了 {deleted_count} 个键")
|
|
|
|
# 验证队列已清空
|
|
new_length = redis_client.llen(queue_name)
|
|
print(f"📊 队列 '{queue_name}' 新长度: {new_length}")
|
|
|
|
if new_length == 0:
|
|
print("✅ 队列已成功清空!")
|
|
else:
|
|
print(f"⚠️ 队列仍有 {new_length} 个任务")
|
|
|
|
# 清理结果后端(可选)
|
|
print("\n🧹 清理结果后端...")
|
|
result_keys = redis_client.keys("celery-task-meta-*")
|
|
if result_keys:
|
|
deleted_results = redis_client.delete(*result_keys)
|
|
print(f"✅ 删除了 {deleted_results} 个任务结果")
|
|
else:
|
|
print("✅ 没有待清理的任务结果")
|
|
|
|
except redis.ConnectionError as e:
|
|
print(f"❌ Redis 连接失败: {e}")
|
|
except Exception as e:
|
|
print(f"❌ 清空队列失败: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
|
|
|
|
def clear_all_celery_data():
|
|
"""清空所有 Celery 相关数据(包括结果)"""
|
|
print("\n🗑️ 清空所有 Celery 数据")
|
|
print("=" * 50)
|
|
|
|
try:
|
|
# 连接到 Redis
|
|
redis_client = redis.Redis(
|
|
host=settings.REDIS_HOST,
|
|
port=settings.REDIS_PORT,
|
|
password=settings.REDIS_PASSWORD,
|
|
db=settings.CELERY_BROKER,
|
|
decode_responses=True
|
|
)
|
|
|
|
# 获取所有 Celery 相关的键
|
|
all_keys = redis_client.keys("*")
|
|
celery_keys = [k for k in all_keys if 'celery' in k.lower() or 'localhost_test_wyl' in k]
|
|
|
|
print(f"📊 找到 {len(celery_keys)} 个 Celery 相关的键")
|
|
|
|
if not celery_keys:
|
|
print("✅ 没有 Celery 数据需要清理")
|
|
return
|
|
|
|
# 显示键列表
|
|
print("\n📋 Celery 相关的键:")
|
|
for key in celery_keys[:10]: # 只显示前10个
|
|
print(f" - {key}")
|
|
if len(celery_keys) > 10:
|
|
print(f" ... 还有 {len(celery_keys) - 10} 个键")
|
|
|
|
# 确认清空
|
|
print(f"\n⚠️ 警告: 即将删除 {len(celery_keys)} 个 Celery 相关的键")
|
|
confirm = input("确认清空所有 Celery 数据? (yes/no): ").strip().lower()
|
|
|
|
if confirm not in ['yes', 'y']:
|
|
print("❌ 操作已取消")
|
|
return
|
|
|
|
# 删除所有键
|
|
if celery_keys:
|
|
deleted_count = redis_client.delete(*celery_keys)
|
|
print(f"✅ 已删除 {deleted_count} 个键")
|
|
|
|
print("✅ 所有 Celery 数据已清空!")
|
|
|
|
except Exception as e:
|
|
print(f"❌ 清空失败: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
|
|
|
|
def show_queue_info():
|
|
"""显示队列信息"""
|
|
print("\n📊 队列信息")
|
|
print("=" * 50)
|
|
|
|
try:
|
|
# 连接到 Redis
|
|
redis_client = redis.Redis(
|
|
host=settings.REDIS_HOST,
|
|
port=settings.REDIS_PORT,
|
|
password=settings.REDIS_PASSWORD,
|
|
db=settings.CELERY_BROKER,
|
|
decode_responses=True
|
|
)
|
|
|
|
# 队列名称
|
|
queue_name = 'localhost_test_wyl'
|
|
|
|
# 获取队列信息
|
|
queue_length = redis_client.llen(queue_name)
|
|
print(f"📊 队列 '{queue_name}' 长度: {queue_length}")
|
|
|
|
# 获取结果数量
|
|
result_keys = redis_client.keys("celery-task-meta-*")
|
|
print(f"📊 任务结果数量: {len(result_keys)}")
|
|
|
|
# 获取所有 Celery 键
|
|
all_keys = redis_client.keys("*")
|
|
celery_keys = [k for k in all_keys if 'celery' in k.lower() or 'localhost_test_wyl' in k]
|
|
print(f"📊 Celery 相关键总数: {len(celery_keys)}")
|
|
|
|
except Exception as e:
|
|
print(f"❌ 获取队列信息失败: {e}")
|
|
|
|
|
|
def main():
|
|
"""主函数"""
|
|
print("🚀 Celery 队列清理工具")
|
|
print("=" * 50)
|
|
|
|
while True:
|
|
print("\n请选择操作:")
|
|
print("1. 查看队列信息")
|
|
print("2. 清空队列(只删除待处理任务)")
|
|
print("3. 清空所有 Celery 数据(包括结果)")
|
|
print("4. 退出")
|
|
|
|
choice = input("\n请输入选项 (1-4): ").strip()
|
|
|
|
if choice == '1':
|
|
show_queue_info()
|
|
elif choice == '2':
|
|
clear_celery_queue()
|
|
elif choice == '3':
|
|
clear_all_celery_data()
|
|
elif choice == '4':
|
|
print("👋 再见!")
|
|
break
|
|
else:
|
|
print("❌ 无效选项,请重新选择")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |