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

Django后台任务运行方案咨询:替代django-background-tasks及任务实现

Django后台任务工具推荐及任务状态管理方案

问题场景

之前使用django-background-tasks处理后台任务,但该包已停止维护,与新版Django存在兼容性问题。当前在views.py中直接调用run_job函数执行Matlab模拟任务,代码如下:

def run_job():
   eng = matlab.engine.start_matlab()

   eng.addpath(self.utils_dir)
   eng.addpath(self.inp_dir)

   eng.cd(self.t_dir, nargout=0)
   eng.main([self.data_path], nargout=0)

前端上传文件后,后端需等待模拟完成才能响应,且用户切换网页标签时任务会直接终止。需要将模拟任务移至后台运行以避免中断,同时寻求可用的后台任务工具包推荐。

补充信息

在models.py中定义了file_upload模型,尝试通过task_info字段存储任务运行及完成状态,但不确定是否需要在models.py中添加管理命令:

class file_upload(models.Model):
    uploader = models.ForeignKey(User, on_delete=models.CASCADE)
    ids = models.AutoField(primary_key=True)
    added_on = models.DateTimeField(auto_now_add=True, null=True)

    file_name = models.CharField(max_length=255)

    # registration
    verification_token = models.CharField(max_length=255, null=True, blank=True, default="")

    # running job
    # running_job = models.CharField(max_length=255)

    # finished jobs
    # finished_jobs = models.CharField(max_length=255)

    # task dict {task_name, task_status}
    task_info = models.TextField(null=True, blank=True)

工具推荐与实现建议

1. Celery

  • 目前最主流的Django异步任务框架,支持异步任务、定时任务,生态完善,与新版Django兼容良好。
  • 实现思路:将run_job包装为Celery任务,在视图中通过run_job.delay()将任务提交至队列,使用Redis或RabbitMQ作为消息中间件。
  • 状态管理:利用Celery的AsyncResult获取任务状态,将任务ID、状态(如PENDING/RUNNING/SUCCESS/FAILURE)以JSON格式存入file_upload的task_info字段。

2. Django Q

  • 轻量级任务框架,配置简单,无需额外消息中间件(支持SQLite/Redis/MongoDB),适合中小规模项目。
  • 实现方式:安装并配置后,将run_job注册为任务,视图中调用async_task(run_job)触发任务,通过Django Q的API查询任务状态并同步至模型字段。

3. Huey

  • 极简风格的任务框架,依赖Redis,API简洁易上手,与Django集成友好。
  • 用法:定义Huey任务后,在视图中触发任务,通过任务ID查询状态,更新至file_upload模型的对应字段。

关于模型与管理命令的说明

  • 无需在models.py中添加管理命令。管理命令用于执行脚本类操作(如启动任务worker、清理过期任务),应放在management/commands目录下(例如创建start_worker.py来启动Celery worker或Django Q集群)。
  • task_info字段建议改用JSONField(Django 3.1+支持)替代TextField,更便于存储和解析结构化的任务状态数据:
    from django.db.models import JSONField
    
    task_info = JSONField(null=True, blank=True, default=dict)
    
  • 任务执行过程中,可通过任务框架的回调或定时查询机制更新task_info中的状态,前端可通过AJAX轮询或WebSocket实时获取状态更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 13:07:18