tornado 和 django 处理顺序

Posted

技术标签:

【中文标题】tornado 和 django 处理顺序【英文标题】:tornado and django proccesing order 【发布时间】: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()

当我们运行上述项目时,我们认为问题如下。

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

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

你有什么想法吗?

谢谢...

【问题讨论】:

【参考方案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 的用户。那么当我们分开这个过程时,我们如何进行身份验证,你能举个例子吗?

以上是关于tornado 和 django 处理顺序的主要内容,如果未能解决你的问题,请参考以下文章

Centos7部署tornado项目

聊天应用程序:将 Django 与 sockjs-tornado 和 redis 一起使用

tornado内置接口调用顺序initializeprepare...

websocket[tornado] 的单个实例可以处理不同的请求吗?

一篇关于django,tornado性能测试的非专业性报告

Python Web 框架:Tornado