【发布时间】: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