如何在 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] 管道损坏” 的相关文章

  • 将字符串转换为带有毫秒和时区的日期时间 - Python

    我有以下 python 片段 from datetime import datetime timestamp 05 Jan 2015 17 47 59 000 0800 datetime object datetime strptime t
  • Python PAM 模块的安全问题?

    我有兴趣编写一个 PAM 模块 该模块将利用流行的 Unix 登录身份验证机制 我过去的大部分编程经验都是使用 Python 进行的 并且我正在交互的系统已经有一个 Python API 我用谷歌搜索发现pam python http pa
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • Pycharm Python 控制台不打印输出

    我有一个从 Pycharm python 控制台调用的函数 但没有显示输出 In 2 def problem1 6 for i in range 1 101 2 print i end In 3 problem1 6 In 4 另一方面 像
  • DreamPie 不适用于 Python 3.2

    我最喜欢的 Python shell 是DreamPie http dreampie sourceforge net 我想将它与 Python 3 2 一起使用 我使用了 添加解释器 DreamPie 应用程序并添加了 Python 3 2
  • Python 多处理示例不起作用

    我正在尝试学习如何使用multiprocessing但我无法让它发挥作用 这是代码文档 http docs python org 2 library multiprocessing html from multiprocessing imp
  • 如何使用包含代码的“asyncio.sleep()”进行单元测试?

    我在编写 asyncio sleep 包含的单元测试时遇到问题 我要等待实际的睡眠时间吗 I used freezegun到嘲笑时间 当我尝试使用普通可调用对象运行测试时 这个库非常有用 但我找不到运行包含 asyncio sleep 的测
  • 如何使用 Scrapy 从网站获取所有纯文本?

    我希望在 HTML 呈现后 可以从网站上看到所有文本 我正在使用 Scrapy 框架使用 Python 工作 和xpath body text 我能够获取它 但是带有 HTML 标签 而且我只想要文本 有什么解决办法吗 最简单的选择是ext
  • 如何使用装饰器禁用某些功能的中间件?

    我想模仿的行为csrf exempt see here https docs djangoproject com en 1 11 ref csrf django views decorators csrf csrf exempt and h
  • 使用 Pycharm 在 Windows 下启动应用程序时出现 UnicodeDecodeError

    问题是当我尝试启动应用程序 app py 时 我收到以下错误 UnicodeDecodeError utf 8 编解码器无法解码位置 5 中的字节 0xb3 起始字节无效 整个文件app py coding utf 8 from flask
  • Python 中的二进制缓冲区

    在Python中你可以使用StringIO https docs python org library struct html用于字符数据的类似文件的缓冲区 内存映射文件 https docs python org library mmap
  • feedparser 在脚本运行期间失败,但无法在交互式 python 控制台中重现

    当我运行 eclipse 或在 iPython 中运行脚本时 它失败了 ascii codec can t decode byte 0xe2 in position 32 ordinal not in range 128 我不知道为什么 但
  • python pandas 中的双端队列

    我正在使用Python的deque 实现一个简单的循环缓冲区 from collections import deque import numpy as np test sequence np array range 100 2 resha
  • 表达式中的 Python 'in' 关键字与 for 循环中的比较 [重复]

    这个问题在这里已经有答案了 我明白什么是in运算符在此代码中执行的操作 some list 1 2 3 4 5 print 2 in some list 我也明白i将采用此代码中列表的每个值 for i in 1 2 3 4 5 print
  • 如何将 numpy.matrix 提高到非整数幂?

    The 运算符为numpy matrix不支持非整数幂 gt gt gt m matrix 1 0 0 5 0 5 gt gt gt m 2 5 TypeError exponent must be an integer 我想要的是 oct
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • 您可以在 Python 类型注释中指定方差吗?

    你能发现下面代码中的错误吗 米皮不能 from typing import Dict Any def add items d Dict str Any gt None d foo 5 d Dict str str add items d f
  • Spark.read 在 Databricks 中给出 KrbException

    我正在尝试从 databricks 笔记本连接到 SQL 数据库 以下是我的代码 jdbcDF spark read format com microsoft sqlserver jdbc spark option url jdbc sql
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数

随机推荐

  • 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 处理程序中