代码之家  ›  专栏  ›  技术社区  ›  bouvard

我应该如何存储从Django调用的长时间运行的进程的状态?

  •  5
  • bouvard  · 技术社区  · 17 年前

    我正在开发一个Django应用程序,它允许用户上传文件。在将这些文件发送到之前,我需要对它们执行一些服务器端处理 Amazon S3 this question this blog post 我决定,处理此问题的最佳方式是让我的视图处理程序调用 Pyro

    我可以很容易地处理轮询,但我不确定存储进程状态的适当位置在哪里。它需要可由Pyro进程写入,并可由我的轮询视图读取。

    3 回复  |  直到 9 年前
        1
  •  6
  •   S.Lott    17 年前

    当上传到达时,我们创建上传的File对象,并创建一个Request。

    我们返回一个200的“我们正在处理”页面——它显示了请求及其状态。

    我们的批处理程序使用Django ORM。当它完成时,它会更新Request对象。我们可以(但不能)发送电子邮件通知。大多数情况下,我们只是更新状态,以便用户可以再次登录并看到处理已完成。


    批处理服务器体系结构说明。

    当批处理服务器启动时,可能会有未处理的请求,而它从未得到POST。因此,默认的启动方式是将所有工作从请求队列中提取出来——假设它可能遗漏了一些东西。

        2
  •  5
  •   Bartosz Ptaszynski    16 年前

    当然,您可以将数据库用作队列,但也有专门为此目的开发的解决方案。

    AMQP Celery Carrot 以及类似的代理服务器 RabbitMQ ZeroMQ

    这就是我们在最新项目中使用的,而且效果很好。

    对于你的问题,Celery和RabbitMQ似乎是最合适的。RabbitMQ提供了消息的持久性,Celery提供了简单的轮询视图,以检查并行运行的进程的状态。

    您可能也有兴趣 octopy .

        3
  •  1
  •   brianz    17 年前

    所以,这是你需要的一个工作队列。对于您的情况,我绝对会支持DB来拯救状态,即使这些状态是短暂的。听起来这将满足您的所有要求,并且实施起来并不困难,因为您已经拥有了所有可用的移动部件。保持简单,除非你 需要 更复杂的东西。

    Gearman .