Flask 是单线程运行,如果在某个页面中执行了一些耗时的工作,那么程序就会在这里等待,无法响应其他的请求。也就是说,如果一个路由响应函数中有阻塞代码,那么其他用户无法访问这个 web 服务器,而且自己也打不开其他页面了。
那么如何解决这个问题呢?这里提供两种解决方案
第一种方案
开启flask线程
app.run(host='0.0.0.0', port=5000, debug=False) #改为 app.run(host='0.0.0.0', port=5000, debug=False, threaded=True)
第二种方案
使用gevent网络并发库,我们首先进行安装
pip install gevent #然后导入模块并打上猴子补丁 from gevent import monkey monkey.patch_all()
最后将我们的启动方式换成gevent异步启动的方式
app.run(host='0.0.0.0', port=5000, debug=False) #改为 from gevent import pywsgi app.debug = False server = pywsgi.WSGIServer( ('0.0.0.0', 5000 ), app ) server.serve_forever()
这样我们的应用就可以异步来解决等待耗时的问题了
注意我们应在最开始的地方导入gevent模块并打上猴子补丁,不然控制台会报一个警告,猴子补丁使用ssl可能会导致程序错误
manager.py:18: MonkeyPatchWarning: Monkey-patching ssl after ssl has already been imported may lead to errors, including RecursionError on Python 3.6. It may also silently lead to incorrect behaviour on Python 3.7. Please monkey-patch earlier. See https://github.com/gevent/gevent/issues/1016. Modules that had direct imports (NOT patched): ['urllib3.util (D:\\python3\\lib\\site-packages\\urllib3\\util\\__init__.py)', 'urllib3.contrib.pyopenssl (D:\\python3\\lib\\site-packages\\urllib3\\contrib\\pyopenssl.py)'].