Flask異步化gevent 異步編程concurrent.futures

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章