我的Flask应用程序将接收一个请求,进行一些处理,然后向一个慢的外部端点发出一个请求,该请求需要5秒的响应时间。看起来运行Gunicorn和Gevent将允许它同时处理许多缓慢的请求。如何修改下面的示例以使视图不被阻塞?
import requests
@app.route('/do', methods = ['POST'])
def do():
result = requests.get('slow api')
return result.content
gunicorn server:app -k gevent -w 4
您可以使用
grequests
。它允许其他greenlet在发出请求时运行。它与requests
库兼容,并返回一个requests.Response
对象。用法如下:编辑:我添加了一个测试,发现时间并没有随着grequests而增加,因为gunicorn的gevent工作程序在初始化时已经执行了猴子修补:https://github.com/benoitc/gunicorn/blob/master/gunicorn/workers/ggevent.py#L65
首先是背景,阻塞套接字是默认类型的套接字,一旦开始读取应用程序或线程,在实际读取数据或断开连接之前不会重新获得控制权。默认情况下,
python-requests
就是这样操作的。有一个称为grequests
的派生,它提供非阻塞读取。来源:https://docs.python.org/2/howto/sockets.html
它还说:
但是你想通过让它产生自己的线程来增加你的视图的复杂性吗。尤其是当gunicorn作为async workers时?
以及
所以长话短说,不要改变任何事情!就这样吧。如果您要做任何更改,就让它引入缓存。考虑使用python请求开发人员推荐的扩展名Cache-control。
如果使用gunicorn部署Flask应用程序,它已经是非阻塞的。如果客户机正在等待您的某个视图的响应,则另一个客户机可以向同一个视图发出请求,而不会出现问题。将有多个工人同时处理多个请求。不需要更改代码就可以工作。这也适用于几乎所有的烧瓶部署选项。
相关问题 更多 >
编程相关推荐