[英]Flask and Tornado Applciation does not handle multiple concurrent requests
我正在用Tornado運行一個簡單的Flask應用程序,但是視圖一次只能處理一個請求。 如何使其處理多個並發請求?
我使用的解決方法是派生並使用多個進程來處理請求,但是我不喜歡這種解決方案。
from flask import Flask
app = Flask(__name__)
@app.route('/flask')
def hello_world():
return 'This comes from Flask ^_^'
from tornado.wsgi import WSGIContainer
from tornado.ioloop import IOLoop
from tornado.web import FallbackHandler, RequestHandler, Application
from flasky import app
class MainHandler(RequestHandler):
def get(self):
self.write("This message comes from Tornado ^_^")
tr = WSGIContainer(app)
application = Application([
(r"/tornado", MainHandler),
(r".*", FallbackHandler, dict(fallback=tr)),
])
if __name__ == "__main__":
application.listen(8000)
IOLoop.instance().start()
直接的答案是,您應該使用專用的WSGI服務器,例如uWSGI或Gunicorn,並將其配置為使用多個工作線程。 不要將Tornado用作WSGI服務器。
您對產卵過程的解決是正確的,就像將WSGI與Tornado一起使用是“正確的”一樣。 WSGI是一種同步協議:一個工作程序一次處理一個請求。 Flask不了解Tornado,因此不能通過協程對其進行很好的處理:同步處理請求。
WSGI是一個同步接口,而Tornado的並發模型基於單線程異步執行。 這意味着運行與龍卷風的一個WSGI應用
WSGIContainer
比運行在這樣一個多線程WSGI服務器相同的應用程序可擴展性少 gunicorn或uwsgi 。 僅當在同一過程中合並Tornado和WSGI的好處超過了降低的可伸縮性時,才使用WSGIContainer
。
換句話說:要使用WSGI應用程序處理更多並發請求,請生成更多工作程序。 工作程序的類型也很重要:線程與進程與事件小程序都需要權衡。 您是通過自己創建進程來產生工作程序的,但是更常見的是使用諸如uWSGI或Gunicorn之類的WSGI服務器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.