【问题标题】:How to prevent errno 32 broken pipe?如何防止errno 32 断管?
【发布时间】:2012-08-05 16:44:07
【问题描述】:

目前我正在使用 python 内置的应用程序。当我在个人计算机上运行它时,它可以正常工作。

但是,当我将其移至生产服务器时。它不断向我显示附加的错误,如下所示:。

我进行了一些研究,我得到了最终用户浏览器在服务器仍在忙于发送数据时停止连接的原因。

我想知道为什么会发生这种情况,以及阻止它在生产服务器中正常运行的根本原因是什么,而它却可以在我的个人计算机上运行。任何建议表示赞赏

    Exception happened during processing of request from ('127.0.0.1', 34226)
Traceback (most recent call last):
  File "/usr/lib/python2.7/SocketServer.py", line 284, in
_handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/lib/python2.7/SocketServer.py", line 310, in process_request
    self.finish_request(request, client_address)
  File "/usr/lib/python2.7/SocketServer.py", line 323, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/lib/python2.7/SocketServer.py", line 641, in __init__
    self.finish()
  File "/usr/lib/python2.7/SocketServer.py", line 694, in finish
    self.wfile.flush()
  File "/usr/lib/python2.7/socket.py", line 303, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe

【问题讨论】:

  • this“解决”您的问题吗?
  • 或者连接uwsgi等

标签: python broken-pipe


【解决方案1】:

这取决于您如何测试它,并且可能取决于个人计算机和服务器的 TCP 堆栈实现的差异。

例如,如果您的sendall 总是在个人计算机上立即(或非常快)完成,则连接可能根本不会在发送过程中断开。如果您的浏览器在同一台机器上运行,这种情况很可能发生(因为没有真正的网络延迟)。


一般来说,您只需要通过处理异常来处理客户端在完成之前断开连接的情况。

请记住,TCP 通信是异步的,但这在物理远程连接上比在本地连接上更为明显,因此在本地工作站上很难重现这种情况。具体来说,单台机器上的环回连接通常几乎是同步的。

【讨论】:

  • 我正在通过运行“paster serve abc.ini --reload”对其进行测试,但是无法访问该网页。对于 VMWare 工作站,我使用仅主机选项进行网络连接。那么,您能否建议任何正确运行它的方法?
  • 我认为这是一个单独的 VMWare 网络配置问题(恐怕我对此一无所知)。 原因 工作站和服务器可能表现不同,但解决方案 只是用try ... except 处理异常
【解决方案2】:

您的服务器进程已收到SIGPIPE 写入套接字。这通常发生在您写入在另一端(客户端)完全关闭的套接字时。当客户端程序不等到从服务器接收到所有数据并简单地关闭套接字(使用close 函数)时,可能会发生这种情况。

在 C 程序中,您通常会尝试设置忽略 SIGPIPE 信号或为其设置虚拟信号处理程序。在这种情况下,写入关闭的套接字时将返回一个简单的错误。在您的情况下,python 似乎抛出了一个异常,可以作为客户端过早断开连接来处理。

【讨论】:

【解决方案3】:

这可能是因为您使用两种方法将数据插入数据库,这会导致网站速度变慢。

def add_subscriber(request, email=None):
    if request.method == 'POST':
        email = request.POST['email_field']
        e = Subscriber.objects.create(email=email).save()  <==== 
        return HttpResponseRedirect('/')
    else:
        return HttpResponseRedirect('/')

在上面的函数中,错误是箭头指向的地方。正确的实现如下:

def add_subscriber(request, email=None):
    if request.method == 'POST':
        email = request.POST['email_field']
        e = Subscriber.objects.create(email=email)
        return HttpResponseRedirect('/')
    else:
        return HttpResponseRedirect('/')

【讨论】:

    【解决方案4】:

    如果您的请求被阻塞或花费太长时间,并且在请求端超时后,它会关闭连接,然后,当响应端(服务器)尝试写入套接字时,通常会发生损坏的管道错误将抛出管道损坏错误。

    【讨论】:

      【解决方案5】:

      如果它是 python 一个 web 应用程序或服务,如 Flask 或 FastAPI,如果生产服务器配置为超时一个需要太长时间的请求,则可能会出现此错误。 Gunicorn 和 Uvicorn 中有 GRACEFUL_TIMEOUT 和 TIMEOUT 等相关参数需要根据您的应用程序的需要进行配置。您可能还想检查您的反向代理或网关超时阈值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-20
        • 2018-11-01
        • 2020-07-06
        • 1970-01-01
        • 1970-01-01
        • 2021-01-04
        • 2017-04-22
        • 2023-03-17
        相关资源
        最近更新 更多