在 Tornado Web 服务器上运行 Django 以获得异步 + django admin + django orm 可能性的最佳方法是啥?
Posted
技术标签:
【中文标题】在 Tornado Web 服务器上运行 Django 以获得异步 + django admin + django orm 可能性的最佳方法是啥?【英文标题】:What is the best way to run Django on Tornado Web Server to have async + django admin + django orm possibilities?在 Tornado Web 服务器上运行 Django 以获得异步 + django admin + django orm 可能性的最佳方法是什么? 【发布时间】:2012-02-02 18:15:43 【问题描述】:我想要一个带有 tornado 后端的 django 管理面板,它将处理来自在线游戏的请求。我暂时不知道,用下一种方式加载django app是不是一个好主意:
wsgi_app = tornado.wsgi.WSGIContainer(
django.core.handlers.wsgi.WSGIHandler())
tornado_app = tornado.web.Application(
[
('/hello-tornado', HelloHandler),
('.*', tornado.web.FallbackHandler, dict(fallback=wsgi_app)),
])
server = tornado.httpserver.HTTPServer(tornado_app)
server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
HelloHandler 将成为后端解析器。
在结合 wsgi + ioloop 时我会失去一些性能吗?
如果它是一个糟糕的解决方案,它可以运行 2 个应用程序:django admin 和 tornado web。你能回答我如何在 Tornado App 中使用 Django ORM 吗?
【问题讨论】:
为什么不直接使用 Django? 需要有 django 管理面板和一些用于频繁游戏请求的异步代码 【参考方案1】:只要把这个方程解出来。
你想要非阻塞 IO - X。 你想拥有 django ORM - Y. 你想拥有 django admin - Z.现在,逐点移动:
对于 X - 龙卷风本身就足够了。 对于 Z - django 本身就足够了。我不认为,你想拥有 数以千计的管理员同时管理您的网站。 对于 Y,它更难。 Django ORM 正在阻塞自己。最好的方法 - 不要将 Django ORM 与龙卷风一起使用。
第二种方式 - 如果您确定它不会阻塞整个应用程序,您可以更深入地研究并将其直接集成到龙卷风中。从this 答案中获取解决方案。
第三种方式 - 您可以将您的 django 应用程序转换为服务,这使得 ORM 工作繁重,您可以使用来自 tornado 的AsyncHTTPCLient
访问此服务。
第四种方式 - 将 tornado web 服务器集成到您的 django 应用程序中。实际上,它会给你带来小的性能提升。
第五种方式 - 使用两个 Tornado Web 服务器。听起来很疯狂,是的。使用一个与 Django ORM 集成,第二个与AsyncHTTPClient
一起使用。
我相信,您可以两全其美。
【讨论】:
你的回答让我顿悟了。我将使用我现有的 django 驱动的 REST API 从我希望非阻塞并由 Tornado 处理的特殊 URL 执行数据库写入。不错!【参考方案2】:Django 不是异步的,因此在 Tornado 中运行 Django 将消除您可能从 Tornado 获得的大部分性能优势。
如果您想要最大的异步性能,您应该使用 Tornado 和非阻塞数据库(我假设您希望 Django admin 与 SQL 数据库一起使用)。
如果您想最大限度地简化开发,请使用 Django,它的 ORM 系统和管理工具。
不幸的是,你不能只是混合两全其美。
所以,是的,你会失去性能。在这种情况下,我可能会使用 Tornado 并放弃 Django admin。如果您已经确定要妥协,您可以编写两个应用程序,共享一个数据库,但这意味着您需要维护两个数据访问层。
【讨论】:
以上是关于在 Tornado Web 服务器上运行 Django 以获得异步 + django admin + django orm 可能性的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章