如何在 WSGI 处理程序中捕获“[Errno 32] 管道损坏”

2024-02-28

WSGI 对于构建高度并发的 HTTP 服务器以支持例如然而,长轮询通常会在某个时刻被客户端结束长时间运行的 HTTP 请求;要清理任何资源并打开句柄,应该向 WSGI 服务器后端通知任何此类事件,但是,目前似乎无法在 WSGI 处理程序中捕获这些事件:

# pseudocode example

def application(env, start_response):
    start_response(...)

    q = Queue()
    ev_handle = register_event_handler(lambda event, arg: q.put((event, arg)))

    # ??? need to call e.g. ev_handle.unregister() when the HTTP request is terminated

    return iter(lambda: render(q.get()), None)

例如,当使用gevent.pywsgi,相应的异常(error: [Errno 32] Broken pipe) 被抛出到 gevent 内部的某个地方,并且似乎从未出现在处理程序可能看到它的任何地方:

Traceback (most recent call last):
  File "/Users/erik.allik/.virtualenvs/myproj/lib/python2.7/site-packages/gevent/pywsgi.py", line 508, in handle_one_response
    self.run_application()
  File "/Users/erik.allik/.virtualenvs/myproj/lib/python2.7/site-packages/gevent/pywsgi.py", line 495, in run_application
    self.process_result()
  File "/Users/erik.allik/.virtualenvs/myproj/lib/python2.7/site-packages/gevent/pywsgi.py", line 486, in process_result
    self.write(data)
  File "/Users/erik.allik/.virtualenvs/myproj/lib/python2.7/site-packages/gevent/pywsgi.py", line 376, in write
    self._write(data)
  File "/Users/erik.allik/.virtualenvs/myproj/lib/python2.7/site-packages/gevent/pywsgi.py", line 369, in _write
    self._sendall(data)
  File "/Users/erik.allik/.virtualenvs/myproj/lib/python2.7/site-packages/gevent/pywsgi.py", line 355, in _sendall
    self.socket.sendall(data)
  File "/Users/erik.allik/.virtualenvs/myproj/lib/python2.7/site-packages/gevent/socket.py", line 458, in sendall
    data_sent += self.send(_get_memory(data, data_sent), flags)
  File "/Users/erik.allik/.virtualenvs/myproj/lib/python2.7/site-packages/gevent/socket.py", line 435, in send
    return sock.send(data, flags)

看起来当请求终止时会发生什么,除了(看似无法捕获的)异常回溯之外,从 WSGI 处理程序返回的迭代器是.close()-d。因此可以确定何时应关闭与响应关联的任何工作人员/资源/句柄。基本上就是这样werkzeug.wsgi.ClosingIterator https://github.com/mitsuhiko/werkzeug/blob/master/werkzeug/wsgi.py#L643 does:

class ClosingIterator(object):
    def __init__(self, iterable, on_close):
        iterator = iter(iterable)
        self.close = on_close
    def __iter__(self):
        return self
    def __next__(self):
        return self._next()

def application(env, start_response):
    start_response(...)

    q = Queue()
    ev_handle = register_event_handler(lambda event, arg: q.put((event, arg)))

    return ClosingIterator(
        iter(lambda: render(q.get()), None),
        on_close=ev_handle.unregister
    )

然而,这并没有消除错误消息/回溯,但这似乎是可以容忍的,除非有人能想出一个可以解决这个问题的解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 WSGI 处理程序中捕获“[Errno 32] 管道损坏” 的相关文章

随机推荐

  • getComputedStyle 规范中是否指定了颜色格式?

    我正在解析返回的颜色字符串getComputedStyle to get R G B and A从中获取价值 到目前为止 在 Chrome 和 Firefox 中 颜色值似乎总是返回rgb or rgba易于解析的格式 const r g
  • 在选项卡式活动中将 sqlite 数据库中的所有数据显示到列表视图中

    作为 Android 开发的新手 我已经在这个问题上被困了几个星期了 而且越来越累了 在查看了每个教程并阅读了我能找到的每个问题和答案之后 我仍然不知道如何让 Android Studio 只获取 SQLite 数据库中的内容并将其内容粘贴
  • 未找到 EGLConfig

    我正在尝试使用 android 制作简单的游戏AndEngine教程 http www raywenderlich com 12065 how to create a simple android game 现在 当我运行该项目时 我收到错
  • AngularJS 只有 ng-repeat 动画中的第一个元素

    由于某种原因 使用下面的代码 ngRepeat 仅对第一个项目进行动画处理并立即显示其余项目 一旦scope categories项目已更新 模板中触发了 ng repeat dataSource getCategories then fu
  • C++ 复制构造函数和浅复制

    假设我有一个类 其中有许多显式 静态分配 成员和一些动态分配的指针 当我声明一个复制构造函数时 我对手动分配的成员进行了深层复制 我不想显式地复制每个静态分配的成员 如何在显式复制构造函数中使用隐式 默认 复制构造函数功能 Use 遏制 c
  • 如何使用 PKAddPassButton 添加“添加到 Apple 钱包”按钮 - swift

    抱歉 如果这听起来很愚蠢 这里完全是菜鸟 我正在尝试创建 添加到Apple Wallet 按钮 但我不知道怎么办 我已经尝试过代码片段here https stackoverflow com questions 49773184 how t
  • MFMessageComposeViewController 中 MessageComposeResult 的条件与 swift [重复]

    这个问题在这里已经有答案了 我正在尝试实现 MFMessageComposeViewControllerDelegate 所需的方法 func messageComposeViewController controller MFMessag
  • AngularJS http.post() 返回 404

    祝大家圣诞快乐 我正在使用 Phonegap AngularJS 应用程序 我正在尝试创建一个 http Post 但它返回 404 错误 我尝试使用 jquery 1 10 2 进行 POST 它有效 我已经为此花费了几天时间 这是完成应
  • 试图阻止 jQuery Mobile 滑动手势冒泡,但它不起作用

    我正在使用 jQuery Mobile 并创建了一些类似于 Android Holo Tabs 的东西 http note io 18RNMRk http note io 18RNMRk 为了使滑动手势能够在选项卡之间切换 这是我添加的代码
  • 设置 MimeMessage 的内容类型?

    我对哑剧消息的内容类型有一个困惑 假设我有一条哑剧消息 这是一条多部分消息 正文部分如下 Mime 正文部分包含纯文本 html 文本 如中的一些字母 正文加粗 第二个哑剧身体部分包含附件 第三个哑剧正文部分包含一张内联图像 通过 cid
  • 使用图表构建交易平台 - 对 Python GUI 库的建议

    我正在构建一个小程序来从市场检索数据并实时绘制图表 虽然交易决策将在很大程度上自动化 但图表会不断更新 以便有人可以跟踪决策的制定方式 并在必要时进行手动干预 对于该任务 对于 Python 来说 什么是一个好的 GUI 库 以下是考虑因素
  • 在 Selenium 中使用无头 Chrome 设置用户数据目录 [重复]

    这个问题在这里已经有答案了 我试图让无头 Chrome 工作 同时使用以下命令设置用户数据目录 from selenium import webdriver options webdriver ChromeOptions options a
  • 简单的“数组中的最大值”和复杂性计算

    我对这些东西还很陌生 我需要你的帮助 我应该构建一个高效的简单算法 该算法返回大小为 n 的数组中的最大值 其中包含重复的数字 1 2 n 然后我必须确定最佳运行时间 平均运行时间和最差运行时间 所以我有两个问题 首先 我试图理解这个简单算
  • 在 Android 中设置 TextView 从另一个线程或 BeginInvoke 可见

    我正在开发一个 Android 2 2 应用程序 我在活动上有一个事件侦听器 并且我想在收到事件时设置可见的 TextView 但有一个错误 我只能将其设置为从 UI 线程可见 在 C 和 Windows Mobile 中 有一个 Begi
  • 使用 javascript 从 itemprop 读取值

    是否可以使用 javascript 读取价格 span span 178 00 span span 我只想定价 178 00 我只能使用javascript 任何建议将不胜感激 如果您有产品元素product并且您使用的是现代浏览器 这应该
  • 当我按下 return/enter 键时,h:inputText 可以调用托管 bean 内的方法吗

    所以我有一个inputText有它的价值挂钩myBean text 我希望如果我单击 Enter Return 键 inputText 将调用内部的方法myBean做某事 谁能帮我 根据您的问题历史记录 我知道您正在使用 JSF 2 0 因
  • 如何使用 Gradle Bulid Tool 解决依赖关系并编译 Junit 测试类

    我是 Gradle 新手 目前我添加了一个小型 java 项目并且执行得很好 如果我的理解是正确的 请纠正我 因为 java 可用 我们能够编译 java 项目并执行得很好 为了测试 我在 junit 的帮助下编写了一个测试类 但我无法编译
  • 将控制字符应用于字符串 - Python

    我正在尝试将控制字符 例如应删除前面的字符的 x08 x08 应用于字符串 向后移动 写入空格 向后移动 例如 当我输入 python 控制台时 s test x08 x08 print s print repr s 我进入我的终端 tes
  • 如何将 git status 限制为仅当前目录中的常规文件?

    我想查看当前目录的状态 因为子目录有很多变化 我就是这么做的not我想看看 下面的命令并不能解决问题 git status 有没有办法获得这种报告 除了 grep 的输出之外git status Use git status
  • 如何在 WSGI 处理程序中捕获“[Errno 32] 管道损坏”

    WSGI 对于构建高度并发的 HTTP 服务器以支持例如然而 长轮询通常会在某个时刻被客户端结束长时间运行的 HTTP 请求 要清理任何资源并打开句柄 应该向 WSGI 服务器后端通知任何此类事件 但是 目前似乎无法在 WSGI 处理程序中