【问题标题】:forking a process within a django view在 django 视图中分叉一个进程
【发布时间】:2014-01-06 20:28:05
【问题描述】:

我有一个网络服务,它启动一个可能需要一分钟的过程。我想返回一个 204,它有效地表示“我已成功收到您的请求”,但在后台运行缓慢的进程。

我正在尝试通过分叉另一个进程来做到这一点:

p = Process(target = modelObj.slowProcess) 
p.start()
logger.debug('sending 204')
return HttpResponse( status=204)

这部分代码似乎执行得很好,但是会绊倒 django 组件。打印调试语句,并执行该过程,但是当我在 chrome 的调试器中查看网络流量时,它说上传状态为“已取消”。由于我没有取消浏览器端的事件,我认为这意味着连接已断开。我从来没有从服务器得到任何响应,所以我似乎以某种方式破坏了请求过程。

我怎样才能 fork 那个单独的进程并且仍然有 204 被交付?

【问题讨论】:

  • 204 表示No content,大多数用户代理都会按照您描述的方式进行解释。既然无论如何都不能立即显示处理结果,为什么不直接发送200
  • 我不明白浏览器到底发生了什么?你可以张贴图片吗?它应该工作正常。
  • 我可以看到你正在执行一个 python 函数。 modelObj.slowProcess不能使用线程的原因是什么?
  • @PauloBu 浏览器永远不会得到响应。连接断开。
  • 这就是我的意思——返回204 在技术上并没有错误或其他任何东西,但它会导致浏览器中出现非常奇怪的行为——这就是为什么我建议发送带有链接的200长时间运行过程的结果将可用(甚至更好302),并且一旦准备好,就会进行一些AJAX轮询以显示异步过程的结果。您可能还想看看Celery

标签: python django asynchronous subprocess


【解决方案1】:

cmets 向我展示了我做错了什么。

有问题的请求来自正在上传文件的隐藏 iframe。在许多情况下,您可以将其视为 ajax 请求,但如果 iframe 返回 204,就会出现问题。 iframe 必须取回一些内容事件,尽管对该内容没有做任何实质性的事情。

【讨论】:

    猜你喜欢
    • 2012-02-27
    • 2021-05-31
    • 2012-04-19
    • 2011-06-07
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多