異步 WEB 架構的特色:python
gevent 爲 Python 提供了比較完善的協程支持,其基於 greenlet 實現協程。flask
當 greenlet 遇到如網絡訪問、磁盤 IO 等操做時,就將自動切換至其餘的 greenlet,待操做完成後,在適合的時間點回切 greenlet 繼續執行。因爲網絡訪問、磁盤 IO 等操做耗時較長,且實際 CPU 使用率較低(大部分工做由 DMA 等設備完成)。因此假若非異步,涉及以上操做併發將以順序執行, CPU 長期處於空閒狀態。而異步模式將能實現併發程序間的切換,從而保證 CPU 有較高的利用率,而不是等待如網絡訪問、磁盤 IO 等操做。 小程序
注意:gevent 的使用並不能減小實際 CPU 的使用量,因此若程序的執行過程消耗的全爲 CPU 資源,則其異步也是毫無心義的。網絡
Flask+gevent 的最小程序實例:閉包
最小程序實例以下。架構
from gevent import monkey monkey.patch_all() from flask import Flask from gevent import pywsgi app = Flask(__name__) @app.route('/') def index(): return 'Hello World' server = pywsgi.WSGIServer(('127.0.0.1', 5000), app) server.serve_forever()
注意:爲實現 Flask 與 gevent 的結合,需在程序開頭引入 monkey patch。monkey patch 將以閉包的形式修改能夠實現異步的標準庫,從而實現異步。併發
注意:需使用支持 gevent 的 WSGI,例如:gevent.pywsgi、gunicorn 等。app