当请求过于频繁时,Flask会出现“错误32:破损的管道”。

3
我编写了一个非常简单的 Flask 服务器,它响应 GET 请求并返回我的 home.html 文件。我在 127.0.0.1:5000 上访问该站点,一切都很顺利。
然而,如果我连续几秒钟内尽可能快地按下 "刷新" 按钮(在我的电脑上是 Command+R),那么我的 Flask 就会出现错误并崩溃。
线程Thread-1出现异常: 最近的调用如下: 在"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py"文件中,第801行的bootstrap_inner函数 在"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py"文件中,第754行的run函数 在"/usr/local/lib/python2.7/site-packages/werkzeug/serving.py"文件中,第659行的inner函数 在"/usr/local/lib/python2.7/site-packages/werkzeug/serving.py"文件中,第499行的serve_forever函数 在"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py"文件中,第238行的serve_forever函数 在"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py"文件中,第297行的_handle_request_noblock函数 在"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py"文件中,第295行的_handle_request_noblock函数 在"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py"文件中,第321行的process_request函数 在"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py"文件中,第334行的finish_request函数 在"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py"文件中,第655行的__init__函数 在"/usr/local/lib/python2.7/site-packages/werkzeug/serving.py"文件中,第216行的handle函数 在"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/BaseHTTPServer.py"文件中,第340行的handle函数 在"/usr/local/lib/python2.7/site-packages/werkzeug/serving.py"文件中,第251行的handle_one_request函数 在"/usr/local/lib/python2.7/site-packages/werkzeug/serving.py"文件中,第193行的run_wsgi函数 在"/usr/local/lib/python2.7/site-packages/werkzeug/serving.py"文件中,第184行的execute函数 在"/usr/local/lib/python2.7/site-packages/werkzeug/serving.py"文件中,第152行的write函数 在"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/BaseHTTPServer.py"文件中,第401行的send_header函数 发生IOError错误:[Errno 32] Broken pipe。
我认为发生了以下情况:当我的服务器试图向浏览器传输html时,我按下刷新按钮,导致管道断开。因此,我的服务器感到困惑,然后出现错误。
如何解决这个问题?或者说,这个网站是不可用的,因为任何经常请求我的页面的人都可能会破坏我的网页。
谢谢!
5个回答

3

您可以尝试使用app.run(threaded=True),正如这个 SO答案中建议的那样。


1

我在Ubuntu虚拟机上的Kubernetes中的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)的问题。


1
内置的 Werkzeug 无法在服务器仍在输出其内容时处理并发请求的连接。

与其使用

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

你应该尝试这个。
from gevent.wsgi import WSGIServer
http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()

1

这个错误出现是因为您的服务器负载过高!请停止并重新启动它!


0

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

出现此错误是因为你的服务器无法处理并发请求。你需要一个适当的WSGI服务器来处理并发请求(在多线程环境中使用gunicorn或uWSGI),这样就可以正常工作了。 请查看:http://twistedmatrix.com/trac/wiki/TwistedWeb

问题在于在Flask应用程序仍在忙于处理第一个请求时,你正在通过reload进行第二个请求。它不会响应这个第二个请求,直到完成第一个请求。requests.post()函数正在等待Flask响应,但Flask本身正在等待post()

同时,在Flask提供的服务器中启用线程:

app.run(threaded=True)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接