【问题标题】:Flask and Tornado Applciation does not handle multiple concurrent requestsFlask 和 Tornado 应用程序不处理多个并发请求
【发布时间】:2017-01-31 08:07:48
【问题描述】:

我正在使用 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()

【问题讨论】:

    标签: python flask tornado


    【解决方案1】:

    直接的答案是您应该使用专用的 WSGI 服务器,例如 uWSGI 或 Gunicorn,并将其配置为使用多个工作器。不要将 Tornado 作为 WSGI 服务器。


    您对生成过程的修复是正确的,就像将 WSGI 与 Tornado 一起使用是“正确的”一样。 WSGI 是一种同步协议:一个工作人员一次处理一个请求。 Flask 不知道 Tornado,所以它不能通过使用协程来很好地处理它:处理请求是同步发生的。

    Tornado has a big warning in their docs about this exact thing.

    WSGI是一个同步接口,而Tornado的并发模型是基于单线程异步执行的。这意味着使用 Tornado 的 WSGIContainer 运行 WSGI 应用程序可伸缩性比在多线程 WSGI 服务器(如 gunicornuwsgi)中运行相同的应用程序。仅当在同一进程中组合 Tornado 和 WSGI 的好处大于降低的可伸缩性时,才使用WSGIContainer

    换句话说:要使用 WSGI 应用程序处理更多并发请求,请产生更多工作人员。 worker 的类型也很重要:线程、进程和 eventlet 都有权衡。您通过自己创建进程来生成工作人员,但更常见的是使用 WSGI 服务器,例如 uWSGI 或 Gunicorn。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 2013-01-18
      • 2018-07-14
      • 2020-12-19
      相关资源
      最近更新 更多