You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django-Q任务重叠问题:如何避免调度运行中的任务

避免Django-Q调度已在运行的重复任务

可以通过两种实用方法解决这个问题,避免重复调度正在运行的任务:

方法一:基于缓存实现任务锁

利用缓存(如Redis、Memcached)设置唯一运行标记,任务启动前先检查标记,存在则直接退出,不存在则设置标记并执行任务,结束后释放标记。这种方式轻量高效,适合大多数场景。

from django.core.cache import cache
from django_q.tasks import schedule

def sync_data_task():
    # 生成唯一锁键,确保和任务一一对应
    lock_key = "sync_data_task_running"
    # 检查是否已有任务在运行,超时时间设为任务最大预估执行时长(示例为5分钟)
    if cache.get(lock_key):
        return
    # 设置运行标记
    cache.set(lock_key, True, timeout=300)
    try:
        # 此处编写你的数据同步业务逻辑
        # 比如:fetch_data()、sync_to_db()
        print("执行数据同步操作")
    finally:
        # 无论任务成功失败,都释放锁
        cache.delete(lock_key)

# 调度任务,每分钟执行一次
schedule('myapp.tasks.sync_data_task', schedule_type='I', minutes=1)

方法二:查询Django-Q的Task模型过滤运行中任务

直接通过Django-Q自带的Task模型,查询数据库中是否存在状态为RUNNING的同类型任务,存在则跳过执行。这种方式无需额外依赖缓存,但数据库查询性能略低于缓存锁。

from django_q.models import Task
from django_q.tasks import schedule

def sync_data_task():
    # 过滤出任务名匹配且状态为运行中的任务
    has_running_task = Task.objects.filter(
        name='myapp.tasks.sync_data_task',
        status='RUNNING'
    ).exists()
    if has_running_task:
        return
    # 执行数据同步业务逻辑
    print("执行数据同步操作")

# 调度任务,每分钟执行一次
schedule('myapp.tasks.sync_data_task', schedule_type='I', minutes=1)

注意事项

  • 缓存锁的超时时间建议设置为任务最大可能的执行时长,避免任务异常退出导致锁无法释放。
  • 使用Task模型查询时,需确保Django-Q的任务状态更新及时,避免出现误判。

内容的提问来源于stack exchange,提问作者preator

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:55:24