Flask異步化gevent 異步編程concurrent.futures
- 不做任何異步處理
from flask import Flask
import time
app = Flask(__name__)
@app.route('/', methods=['GET'])
def index():
return 'Hello World'
@app.route('/route1')
def route1():
time.sleep(10)
return 'Route1'
if __name__ == '__main__':
app.run()
先請求route1時,視圖函數還沒有執行完成,然後請求index是需要等待處理狀態的,當route1完成後,纔會處理index這個視圖函數。
- 首先使用gevent做非阻塞IO
from gevent import monkey
monkey.patch_all()
from flask import Flask
import time
app = Flask(__name__)
@app.route('/', methods=['GET'])
def index():
return 'Hello World'
@app.route('/route1')
def route1():
time.sleep(10)
return 'Route1'
if __name__ == '__main__':
from gevent import pywsgi
server = pywsgi.WSGIServer(('127.0.0.1', 5000), app)
server.serve_forever()
通過異步請求處理後,先請求route1時,視圖函數還沒有執行完成,然後請求index不需要等待,直接獲得index返回的結果
但是這裏有個問題,如果第二個請求還是請求route1,那麼第二次請求將會等待前面第一次請求route1完成後,纔會處理第二次請求的route1,雖然不同api可以做到異步請求,但是相同的api還是會阻塞
- 然後使用concurrent.futures做異步編程處理
from gevent import monkey
monkey.patch_all()
from flask import Flask
from concurrent.futures import ThreadPoolExecutor
import time
app = Flask(__name__)
executor = ThreadPoolExecutor(max_workers=12) # 線程池
def sleep_time(s):
time.sleep(s)
print('sleep time over')
return 'end'
@app.route('/', methods=['GET'])
def index():
return 'Hello World'
@app.route('/route1')
def route1():
executor.submit(sleep_time, 10)
return 'Route1'
if __name__ == '__main__':
from gevent import pywsgi
server = pywsgi.WSGIServer(('127.0.0.1', 5000), app)
server.serve_forever()
通過異步編程處理後,當第一次請求route1時,耗時操作丟到線程池去執行,同時請求兩次route1,不會導致阻塞
實現了Flask異步化
下次演示另外一種異步方案,gunicorn + Celery
有疑問請在下面評論或者加qq:1104440778