Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何防止errno 32断管?_Python_Broken Pipe - Fatal编程技术网

Python 如何防止errno 32断管?

Python 如何防止errno 32断管?,python,broken-pipe,Python,Broken Pipe,目前我正在使用python内置的应用程序。当我在个人电脑上运行它时,它可以正常工作 但是,当我将其移动到生产服务器时。它不断向我显示以下附加的错误: 我做了一些研究,得出了最终用户浏览器在服务器仍忙于发送数据时停止连接的原因 我想知道为什么会发生这种情况,以及当它在我的个人计算机上工作时,阻止它在生产服务器中正常运行的根本原因是什么。任何建议都将不胜感激 Exception happened during processing of request from ('127.0.0.1',

目前我正在使用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

这取决于您如何测试它,可能还取决于个人计算机和服务器的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('/')

如果您的请求被阻止或耗时过长,则通常会发生断管错误,请求端超时后,它将关闭连接,然后,当响应端(服务器)尝试写入套接字时,它将抛出断管错误

我通过运行“paster-serve abc.ini--reload”来测试它,但是这个网页永远无法访问。对于VMWare工作站,我使用仅主机选项进行网络连接。那么,您能建议如何正确运行它吗?我认为这是一个单独的VMWare网络配置问题(恐怕我对此一无所知)。不过,工作站和服务器行为可能不同的原因就在上面,解决方案只是使用
try。。。除了
以下是一个关于处理客户端断开连接的好答案:“解决”您的问题吗?或者与uwsgi连接,等等。
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('/')