【发布时间】:2013-11-16 01:09:26
【问题描述】:
我有一个 html.app,它从 CherryPy 后端异步请求其 JSON 数据模型。 JSON 数据的大小有点大 1.74 MB。加载和渲染数据大约需要 1 秒。该应用程序在独立时运行良好。但是,当我通过 mod_wsgi 将它附加到 Apache Web 服务器时,我立即开始注意到问题。
当 html 页面在数据连接关闭之前被刷新时 mod_wsgi 会触发它的臭名昭著
mod_wsgi (pid=917): Exception occurred processing WSGI script '/myapp_path/WebApp.py'
IOError: failed to write data, referer: https://domain/etc/padmin/
ENGINE Started monitor thread 'Session cleanup'.
ENGINE Started monitor thread 'Session cleanup'.
我了解 Apache 在 WSGI 有机会将整个数据泵送到客户端之前关闭数据连接。这没什么大不了的,但它引发了某种内部异常,我无法真正捕获或不知道如何捕获。 CherryPy 的默认行为是在发生未处理的异常时重置会话。我需要更改 CherryPy 的行为,以便当客户端选择不等待很长时间等待数据完成时它不会重置活动会话。我更愿意捕获和抑制 mod_wsgi 异常解决方案,但如果不可能,如果发生未经处理的异常,我会选择阻止“会话清理”操作。 任何帮助将不胜感激。
更新:
我将我的问题追溯到配置不正确的会话存储类型。它应该是 file 但由于非法值,它变成了默认的 ram 类型。问题已解决。
【问题讨论】:
-
关闭连接的不是 Apache,而是 HTTP 客户端。
-
@GrahamDumpleton 我正在考虑修改您的代码以忽略此事件。我只是不明白 ajax 或流媒体应用程序如何与 CherryPy 一起使用。
-
在修改它时,您将违反 WSGI 规范。除非您使用 WSGI write() 回调,这不太可能,否则您永远不会在您的 WSGI 应用程序中看到此异常,所以我认为您一定是误解了某些东西。
-
CherryPy 知道它发生的唯一方法是,它是否在块中流式传输数据,并在所有块被产生之前看到返回的可迭代对象上的 close()。如果它达到这样的长度,我会感到惊讶。
-
我建议您用“我将我的问题追溯到配置不正确的会话存储类型。它应该是文件但由于非法值,它变成了默认的 ram 类型。问题已解决。”然后接受这个问题。
标签: python apache mod-wsgi cherrypy