【问题标题】:tornado and django proccesing ordertornado 和 django 处理顺序
【发布时间】:2015-04-21 11:43:46
【问题描述】:

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

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。我们如何解决这个问题..

你有什么想法吗?

谢谢...

【问题讨论】:

    标签: django asynchronous websocket tornado


    【解决方案1】:

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

    警告

    WSGI 是同步接口,而 Tornado 的并发模型是 基于单线程异步执行。这意味着 使用 Tornado 的 WSGIContainer 运行 WSGI 应用程序的可扩展性不如 在多线程 WSGI 服务器(如 gunicorn 或 uwsgi。仅当组合有好处时才使用 WSGIContainer Tornado 和 WSGI 在同一个进程中的作用大于减少 可扩展性。

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

    【讨论】:

    • 我们尝试了单独的进程,但我们无法在 tornado 中验证登录 django 的用户。那么当我们分开这个过程时,我们如何进行身份验证,你能举个例子吗?
    猜你喜欢
    • 1970-01-01
    • 2011-06-23
    • 2011-12-31
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2012-05-20
    • 1970-01-01
    相关资源
    最近更新 更多