tornado 和 django 处理顺序

tornado and django proccesing order

我们正在 tornado 上使用 django 开发一个项目。

def main():
    tornado.options.parse_command_line()
    wsgi_app = tornado.wsgi.WSGIContainer(
        django.core.handlers.wsgi.WSGIHandler())

    application = Application([(r'/websocket/', planet_socket.WsDate),
                               ('.*', FallbackHandler, dict(fallback=wsgi_app)),
                               ],
                              **settings)

    print options.port
    server = tornado.httpserver.HTTPServer(application)
    server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

if __name__ == '__main__':
    main()

当我们运行项目如上,我们把问题如下。

  1. 当一个请求开始时(例如在屏幕上显示 10K 条记录),所有其他请求都在等待第一个请求完成。
  2. Web Socket 上 运行 的请求正在等待第一个请求的完成。
  3. 当用户启动第一个请求时,所有其他用户都在等待第一个请求完成。

示例项目是 here。我们如何解决这个问题..

你有什么想法吗?

谢谢...

这是 WSGIContainer 的限制:http://www.tornadoweb.org/en/stable/wsgi.html#tornado.wsgi.WSGIContainer

Warning

WSGI is a synchronous interface, while Tornado’s concurrency model is based on single-threaded asynchronous execution. This means that running a WSGI app with Tornado’s WSGIContainer is less scalable than running the same app in a multi-threaded WSGI server like gunicorn or uwsgi. Use WSGIContainer only when there are benefits to combining Tornado and WSGI in the same process that outweigh the reduced scalability.

您需要使您的 Django 应用程序足够快以至于您不介意等待它,或者 运行 Django 和 Tornado 在两个独立的进程中通过网络进行通信。就我个人而言,我只会 运行 Django in WSGIContainer 作为过渡策略的一部分,将所有内容都转换为仅限 Tornado;如果 Django 是您长期战略的一部分,那么我建议您使用单独的流程。