我嘗試設置一個最小的Flask應用程序,它使用eventlet立即響應併發請求,而不是阻塞另一個請求並響應另一請求(如標準Flask調試Web服務器所做的那樣)。使用Flask和eventlet響應併發請求
先決條件:
pip install Flask
pip install eventlet
從我迄今發現在互聯網上我的理解,它應該像這樣工作:
# activate eventlet
import eventlet
eventlet.monkey_patch()
from flask import Flask
import datetime
from time import sleep
# create a new Flask application
app = Flask(__name__)
# a short running task that returns immediately
@app.route('/shortTask')
def short_running_task():
start = datetime.datetime.now()
return 'Started at {0}, returned at {1}'.format(start, datetime.datetime.now())
# a long running tasks that returns after 30s
@app.route('/longTask')
def long_running_task():
start = datetime.datetime.now()
sleep(30)
return 'Started at {0}, returned at {1}'.format(start, datetime.datetime.now())
# run the webserver
if __name__ == '__main__':
app.run(debug=True)
當運行這個文件,然後在網頁瀏覽器打開http://localhost:5000/longTask
標籤,雖然它仍在處理打開另一個標籤http://localhost:5000/shortTask
,但我期望第二個標籤在第一個標籤仍在加載時立即返回。但是,與在標準Werkzeug服務器上運行此類似的情況類似,第二個選項卡僅在第一個標籤在30秒之後完成後才返回。
這裏有什麼問題? 順便說一下,鑑於只有很少的併發用戶(最多5個),這是否會被稱爲Flask的「生產就緒webserver」?
順便說一下,當我使用the Flask-socketio library來運行網絡服務器時,根據文檔,如果它安裝時會自動選擇eventlet,那麼它將按預期工作。
與燒瓶socketio完整的示例:
# activate eventlet
import eventlet
eventlet.monkey_patch()
from flask import Flask
from flask_socketio import SocketIO
import datetime
from time import sleep
# create a new Flask application
app = Flask(__name__)
# activate Flask-socketio
socketio = SocketIO(app)
# a short running task that returns immediately
@app.route('/shortTask')
def short_running_task():
start = datetime.datetime.now()
return 'Started at {0}, returned at {1}'.format(start, datetime.datetime.now())
# a long running tasks that returns after 30s
@app.route('/longTask')
def long_running_task():
start = datetime.datetime.now()
sleep(30)
return 'Started at {0}, returned at {1}'.format(start, datetime.datetime.now())
# run the webserver with socketio
if __name__ == '__main__':
socketio.run(app, debug=True)
優秀!必須將Flask應用程序對象傳遞給'wsgi.server'命令在我看來並不清楚,因爲這個基於Flask的示例非常有用。 – Dirk