关于python:Flask在经常请求时给出“错误32断管”

Flask gives “error 32 broken pipe” when being requested too often

我写了一个非常简单的烧瓶服务器。此服务器响应GET并返回my home.html。我在127.0.0.1:5000参观了现场

到现在一切都很好。

但是,如果我在几秒钟内一直按"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答案中建议的app.run(threaded=True)


内置的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)的问题。