【问题标题】:wsgi - handle client timeoutswsgi - 处理客户端超时
【发布时间】:2014-01-23 14:59:44
【问题描述】:

我正在做一些基本的 wsgi 工作:

def application(environ, start_response):
    start_response("200", [])
    result = some_long_func()
    return [result]

客户端在some_long_func 完成之前断开连接时常发生,我在日志中看到以下内容:

SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected)...

有没有办法在应用程序级别处理断开连接的客户端,即在application() 返回之前?

我的服务器是 uwsgi(独立)。没有框架,只有纯 python。

【问题讨论】:

  • 没有线索。但我很想知道。
  • 您应该澄清“处理”断开连接的客户端的含义。如果你只想忽略它,你可以使用 uWSGI 选项来完成,如果你想始终确保在请求结束时执行代码,只需使用 WSGI close() 方法。
  • @roberto:我想在断开连接时采取一些特定于应用程序的操作,例如将错误记录到数据库中,发送有关该问题的邮件等。

标签: python wsgi uwsgi


【解决方案1】:

如果应用程序返回的可迭代对象有一个 close() 方法,则服务器或网关必须在当前请求完成时调用该方法,无论请求是正常完成还是由于错误而提前终止。

因此,如果在输出迭代器完成之前调用close(),您就知道客户端已断开连接。

【讨论】:

    【解决方案2】:

    没有。在 WSGI 规范的范围内,没有办法处理这个问题。在 mod_wsgi 邮件列表中搜索讨论。一种这样的讨论是:

    【讨论】:

    • 我很困惑。引用您自己的回复:“......当检测到连接关闭时,应用程序将看到 Python 异常,这取决于它要做什么” - 这基本上就是我正在寻找的。
    • 使用您的代码编写方式,您将看不到它并能够处理它,因为您没有使用 write() 可调用(无论如何您都不应该使用)而是返回一个可迭代的字符串。因此,只有 WSGI 服务器会看到断开连接的异常,因此它通常只是记录一些东西。鉴于使用 write() 回调是不好的做法,您唯一会在代码中看到异常的情况是,如果您在断开连接时从 wsgi.input 读取时被阻止。
    • 我明白了。我的想法是在返回之前执行try: write("") except... 只是为了 ping 客户端,如果它中断,则记录异常并且不返回任何内容,否则返回通常的迭代。这是一个愚蠢的想法吗?
    • 好吧,@thg435 并没有问是否只能使用 WSGI。服务器可能有这样的机制。 uwsgi.is_connected() 怎么样?名字看起来很有希望,不幸的是没有文档。
    • 帖子的主题是“wsgi - 处理客户端超时”。对我来说看起来像是一个 WSGI 问题。此外,WSGI 的好处在于它允许人们编写可移植的 Web 应用程序,一些 WSGI 服务器添加的非标准 WSGI 扩展意味着我们又回到了有效的专有接口和供应商锁定的糟糕旧时代。
    猜你喜欢
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 2020-05-27
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 2014-06-17
    相关资源
    最近更新 更多