独特优势:
pip install django-q psycopg2-binary # 推荐PostgreSQL作为任务存储
# settings.py
INSTALLED_APPS = [
...
'django_q',
]
# 数据库配置(推荐PostgreSQL)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydb',
'USER': 'myuser',
'PASSWORD': 'mypass',
'HOST': 'localhost',
'PORT': '5432',
}
}
# Django-Q 核心配置
Q_CLUSTER = {
'name': 'MyAppCluster',
'workers': 4, # 工作进程数
'recycle': 500, # 进程回收前的任务数
'timeout': 60, # 任务超时时间(秒)
'retry': 120, # 失败任务重试延迟
'queue_limit': 100, # 队列容量限制
'bulk': 10, # 批量处理任务数量
'orm': 'default', # 使用默认数据库
'max_attempts': 3, # 任务最大尝试次数
'catch_up': False, # 避免错过任务的追赶执行
'sync': False, # 开发模式同步执行
}
python manage.py makemigrations django_q
python manage.py migrate
# tasks.py
import time
from django_q.tasks import async_task
def process_image(image_id):
"""图像处理耗时任务"""
from .models import Image
image = Image.objects.get(id=image_id)
# 模拟耗时处理
time.sleep(10)
image.process()
return f"Processed {image.name}"
def send_notification(user_id, message):
"""发送通知任务"""
from django.contrib.auth import get_user_model
User = get_user_model()
user = User.objects.get(id=user_id)
user.send_push(message)
# views.py
from django.http import JsonResponse
from .tasks import process_image, send_notification
def upload_image(request):
image = Image.objects.create(file=request.FILES['image'])
# 提交异步任务
async_task(
'app.tasks.process_image', # 任务路径
image.id, # 任务参数
hook='app.hooks.result_hook' # 回调函数
)
# 链式调用示例
async_task(
'app.tasks.send_notification',
request.user.id,
f"正在处理图片 {image.name}"
)
return JsonResponse({"status": "processing", "task_id": image.id})
# hooks.py
from django_q.tasks import result
def result_hook(task):
"""任务完成回调"""
if task.success:
print(f"任务成功: {task.result}")
log_success(task)
else:
print(f"任务失败: {task.result}")
alert_admin(task)
result.save(task) # 保存任务结果到数据库
访问 /admin/django_q/schedule/add/
:
app.tasks.backup_database
from django_q.models import Schedule
def setup_schedules():
# 每天凌晨备份
Schedule.objects.create(
func='app.tasks.backup_database',
schedule_type=Schedule.DAILY,
repeats=-1, # 无限重复
next_run=datetime.now() + timedelta(days=1)
)
# 每15分钟同步数据
Schedule.objects.create(
func='app.tasks.sync_external_data',
minutes=15,
schedule_type=Schedule.MINUTES
)
[program:qcluster]
command=python manage.py qcluster
directory=/opt/yourproject
autostart=true
autorestart=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/qcluster.log
# 多进程模式(默认)
python manage.py qcluster
# 协程模式(高并发I/O密集型)
python manage.py qcluster --worker-class gevent
# 线程模式
python manage.py qcluster --worker-class threading
访问 /admin/django_q/
:
# urls.py
from django.urls import path
from django_q.monitor import prometheus
urlpatterns = [
...
path('metrics/', prometheus),
]
监控指标包括:
djangoq_tasks_in_queue
djangoq_workers_active
djangoq_task_execution_time
tail -f /var/log/qcluster.log
from django_q.tasks import async_task_bulk
def batch_processing(items):
# 单次提交100个任务
tasks = [
('app.tasks.process_item', [item.id])
for item in items[:100]
]
async_task_bulk(tasks)
Q_CLUSTER = {
...
'recycle': 100, # 每处理100个任务重启worker
'max_attempts': 3, # 失败任务最多重试3次
'save_limit': 1000, # 最大保存任务记录数
}
# 高优先级任务
async_task(
'app.tasks.urgent_task',
priority=1, # 0-9,0最高
q_options={'sync': False}
)
# 低优先级任务
async_task(
'app.tasks.low_priority',
priority=8,
q_options={'sync': False}
)
场景 | 推荐配置 | 优势 |
---|---|---|
轻量级应用 | 默认ORM | 零依赖部署 |
高并发IO | gevent协程 | 千级并发 |
CPU密集型 | 多进程 | 充分利用多核 |
定时任务 | Django Admin | 动态配置 |
成功案例:
迁移提示:
从Celery迁移只需替换task.delay()
为async_task()
项目地址:[Django-Q GitHub](Koed00/django-q: A multiprocessing distributed task queue for Django)
文档参考:官方文档
通过Django-Q,开发者无需维护复杂消息队列即可构建高性能异步系统,特别适合中小型项目快速实现任务队列功能!