Flask开启请求异步的两种方式

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)'].


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/690.html