如何防止错误32断管?

目前我正在使用一个内置在 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
418383 次浏览

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

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


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

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

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

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

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

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('/')

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

如果是 Python、 Web 应用程序或服务(如 Flask 或 FastAPI) ,则如果生产服务器配置为超时请求所需时间过长,则可能会发生此错误。在 Gunicorn 和 Uvicorn 有一些相关的参数,比如 GRACEFUL _ TIMEOUT 和 TIMEOUT,需要根据应用程序的需要进行配置。您可能还需要检查反向代理或网关超时阈值。

在程序的顶部尝试这段代码

从信号进口信号,SIGPIPE,SIG _ dfL

信号(SIGPIPE,SIG _ DFL)

应该能修好。