经常请求时,Flask会出现“错误32断管”

时间:2017-05-10 12:58:06

标签: python flask server

我写了一个非常简单的烧瓶服务器。此服务器响应GET并返回我的home.html。 我在127.0.0.1:5000访问该网站

到目前为止一切都很好。

然而,如果我一直按下“新鲜”(我的电脑上的Command + R)很多次,只要我尽可能快,那么,我的烧瓶就会出现这个错误并且会发生故障。

  

线程Thread-1中的异常:   Traceback(最近一次调用最后一次):     在 bootstrap_inner中输入文件“/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py”,第801行       self.run()     文件“/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py”,第754行,运行中       self .__ target(* self .__ args,** self .__ kwargs)     文件“/usr/local/lib/python2.7/site-packages/werkzeug/serving.py”,第659行,内部       srv.serve_forever()     在serve_forever中输入文件“/usr/local/lib/python2.7/site-packages/werkzeug/serving.py”,第499行       HTTPServer.serve_forever(个体经营)     在service_forever中输入文件“/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py”,第238行       self._handle_request_noblock()     在_handle_request_noblock中输入文件“/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py”,第297行       self.handle_error(request,client_address)     在_handle_request_noblock中输入文件“/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py”,第295行       self.process_request(request,client_address)     在process_request中输入文件“/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py”,第321行       self.finish_request(request,client_address)     在finish_request中输入文件“/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py”,第334行       self.RequestHandlerClass(request,client_address,self)     文件“/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py”,第655行,在__init       self.handle()     文件“/usr/local/lib/python2.7/site-packages/werkzeug/serving.py”,第216行,句柄       rv = BaseHTTPRequestHandler.handle(个体经营)     文件“/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/BaseHTTPServer.py”,第340行,句柄       self.handle_one_request()     在handle_one_request中输入文件“/usr/local/lib/python2.7/site-packages/werkzeug/serving.py”,第251行       return self.run_wsgi()     在run_wsgi中的文件“/usr/local/lib/python2.7/site-packages/werkzeug/serving.py”,第193行       执行(self.server.app)     文件“/usr/local/lib/python2.7/site-packages/werkzeug/serving.py”,第184行,执行       写(数据)     文件“/usr/local/lib/python2.7/site-packages/werkzeug/serving.py”,第152行,写入       self.send_header(键,值)     在send_header中输入文件“/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/BaseHTTPServer.py”,第401行       self.wfile.write(“%s:%s \ r \ n”%(关键字,值))   IOError:[Errno 32]管道损坏

我相信这就是发生的事情:当我的服务器试图将html传输到我的浏览器时,我按下了刷新并打破了管道。所以我的服务器感到困惑,然后给出错误。

如何解决这个问题?或者这个网站不能全部使用,因为任何经常询问我的网页的人都可能会破坏我的网页。

谢谢!

5 个答案:

答案 0 :(得分:3)

您可以按照this SO回答中的建议尝试使用CombineInputFormat

答案 1 :(得分:1)

出现此错误是因为您的服务器过载了!停下来开始吧!

答案 2 :(得分:1)

内置的werkzeug无法处理并发请求连接,而服务器仍在搅拌其内容。

而不是使用

 app.run(debug=True,port=5000)

你应该试试这个

from gevent.wsgi import WSGIServer
http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()

答案 3 :(得分:0)

我在Ubuntu VM上的Kubernetes上的Ubuntu Docker容器中也看到了这个错误:

Error on request:
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/serving.py", line 270, in run_wsgi
    execute(self.server.app)
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/serving.py", line 261, in execute
    write(data)
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/serving.py", line 227, in write
    self.send_header(key, value)
  File "/usr/lib/python2.7/BaseHTTPServer.py", line 412, in send_header
    self.wfile.write("%s: %s\r\n" % (keyword, value))
IOError: [Errno 32] Broken pipe

我创建了一个全新的Ubuntu xenial VM并在Kubernetes上的Ubuntu Docker容器中运行相同的代码,并且此错误,并且Python Flask按预期工作。我认为这是我的主机(Ubuntu VM)的问题。

答案 4 :(得分:0)

您使用的是哪个版本的Flask,版本0.12 / 0.13,还是旧版本?

您看到此错误,因为您的服务器无法处理并发请求。您需要一个能够处理并发请求的适当WSGI服务器(在多线程环境中使用gunicorn或uWSGI),它应该可以正常工作。 检查:http://twistedmatrix.com/trac/wiki/TwistedWeb

当您仍在忙着处理第一个请求时,您正在通过重新加载到烧瓶应用程序来发出第二个请求。在完成第一个请求之前,它不会响应第二个请求。 requests.post()函数正在等待Flask响应,但Flask本身正在等待post()

还可以使用以下命令在Flask提供的服务器中启用线程:

app.run(threaded=True)

另请注意,Python 3 socketserver实现更优雅地处理断开连接并继续服务而不是崩溃。