背景:
工作中有一需求,需要请求外部JiRa(类似数据库吧),将请求数据进行分析,从请求到获取数据需要20s,由于这一个接口在等待,导致访问其他接口也跟着等待。为此,必须将该接口转换成异步非阻塞接口。
由于该接口是GET请求,使用celery感觉不太合适,毕竟不是后台post、update,delete等操作,用户着急看返回的数据呢。但是Jiwa不能动啊,只因为这一接口,影响到整个服务,必须得找到解决办法。
1.使用Python内置库asyncio
import asyncio
import nest_asyncio
from flask import Flask
nest_asyncio.apply()
async def get_jira(url):
data = requests.get(url).json()
return data
loop = asyncio.get_event_loop()
app = Flask(__name__)
@app.route("/jira/")
def view():
url = 'www.asdasd.com'
res = loop.run_until_complete(get_jira(url))
return res # 此res就是函数get_jira return 的data
if __name__ == "__main__":
# app.run(debug=False, use_reloader=False)
最好使用flask_script Manager 用命令行启动程序
## --threaded必须加上不然不会异步
# python manages.py runserver -r -d -p 5000 --threaded
1.使用Python内置库asyncio
from flask import Flask, request, g
# gevent
from gevent import monkey
from gevent.pywsgi import WSGIServer
monkey.patch_all()
# gevent end
import time
app = Flask(__name__)
app.config.update(DEBUG=True)
@app.route('/asyn/', methods=['GET'])
def test_asyn_one():
print("asyn has a request!")
time.sleep(10)
return 'hello asyn'
@app.route('/test/', methods=['GET'])
def test():
return 'hello test'
if __name__ == "__main__":
# app.run()
http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()
网友评论