簡體   English   中英

Flask and Tornado Applciation無法處理多個並發請求

[英]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服務器相同的應用程序可擴展性少 gunicornuwsgi 僅當在同一過程中合並Tornado和WSGI的好處超過了降低的可伸縮性時,才使用WSGIContainer

換句話說:要使用WSGI應用程序處理更多並發請求,請生成更多工作程序。 工作程序的類型也很重要:線程與進程與事件小程序都需要權衡。 您是通過自己創建進程來產生工作程序的,但是更常見的是使用諸如uWSGI或Gunicorn之類的WSGI服務器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM