Flask gives “error 32 broken pipe” when being requested too often
我写了一个非常简单的烧瓶服务器。此服务器响应
到现在一切都很好。
但是,如果我在几秒钟内一直按"fresh"(计算机上的command+r),尽可能快,那么我的烧瓶就会出现这个错误并崩溃。
Exception in thread Thread-1:
Traceback (most recent call last):
File"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 801, in bootstrap_inner
self.run()
File"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 754, in run
self.__target(*self.__args, **self.__kwargs)
File"/usr/local/lib/python2.7/site-packages/werkzeug/serving.py", line 659, in inner
srv.serve_forever()
File"/usr/local/lib/python2.7/site-packages/werkzeug/serving.py", line 499, in serve_forever
HTTPServer.serve_forever(self)
File"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 238, in serve_forever
self._handle_request_noblock()
File"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 297, in _handle_request_noblock
self.handle_error(request, client_address)
File"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 295, in _handle_request_noblock
self.process_request(request, client_address)
File"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 321, in process_request
self.finish_request(request, client_address)
File"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 334, in finish_request
self.RequestHandlerClass(request, client_address, self)
File"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 655, in __init
self.handle()
File"/usr/local/lib/python2.7/site-packages/werkzeug/serving.py", line 216, in handle
rv = BaseHTTPRequestHandler.handle(self)
File"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/BaseHTTPServer.py", line 340, in handle
self.handle_one_request()
File"/usr/local/lib/python2.7/site-packages/werkzeug/serving.py", line 251, in handle_one_request
return self.run_wsgi()
File"/usr/local/lib/python2.7/site-packages/werkzeug/serving.py", line 193, in run_wsgi
execute(self.server.app)
File"/usr/local/lib/python2.7/site-packages/werkzeug/serving.py", line 184, in execute
write(data)
File"/usr/local/lib/python2.7/site-packages/werkzeug/serving.py", line 152, in write
self.send_header(key, value)
File"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/BaseHTTPServer.py", line 401, in send_header
self.wfile.write("%s: %s" % (keyword, value))
IOError: [Errno 32] Broken pipe
我相信这就是发生的事情:当我的服务器试图将HTML传输到我的浏览器时,我按下了刷新键并中断了管道。所以我的服务器弄糊涂了,然后出错了。
如何解决这个问题?或者这个网站不可用,因为任何人不断要求我的网页可以打破我的网页。
谢谢!
您可以尝试使用此so答案中建议的
内置的werkzeug无法在服务器仍在大量输出其内容时处理并发的连接请求。
而不是使用
1 | app.run(debug=True,port=5000) |
你应该试试这个
1 2 3 | from gevent.wsgi import WSGIServer http_server = WSGIServer(('', 5000), app) http_server.serve_forever() |
出现此错误是因为服务器超载!停下来,开始!
您使用的是哪个版本的烧瓶,0.12/0.13或更旧的版本?
您看到这个错误是因为您的服务器不处理并发请求。您需要一个能够处理并发请求(在多线程环境中使用gunicorn或uwsgi)的合适的wsgi服务器,它应该可以正常工作。检查:http://twistedmatrix.com/trac/wiki/twistedweb
当你的flask应用程序仍然忙于处理第一个请求时,你会通过重新加载来发出第二个请求。在第一个请求完成之前,它不会响应第二个请求。requests.post()函数正在等待flask响应,但flask本身正在等待post()。
还可以使用以下方法启用烧瓶提供的服务器中的线程:
1 | app.run(threaded=True) |
另外请注意,python 3 socketserver实现更优雅地处理断开连接,并继续提供服务,而不是崩溃。
我在Ubuntu VM上Kubernetes的Ubuntu Docker容器中也看到了这个错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 " % (keyword, value)) IOError: [Errno 32] Broken pipe |
我创建了一个全新的UbuntuXenialVM,并在kubernetes上的UbuntuDocker容器中运行了相同的代码,但没有看到这个错误,python flask工作正常。我认为这是我的主机(UbuntuVM)的问题。