8

我想拥有带有龙卷风后端的 django 管理面板,它将处理来自在线游戏的请求。我目前不知道,以下面的方式加载 django 应用程序是否是个好主意:

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。你能回答我如何将 Django ORM 与 Tornado 应用程序一起使用吗?

4

2 回答 2

15

只要把这个方程解出来。

  • 你想要有非阻塞 IO - X。
  • 你想要 django ORM - Y。
  • 你想要 django 管理员 - Z。

现在,逐点移动:

  • 对于 X - 龙卷风本身就足够了。
  • 对于 Z - django 本身就足够了。我认为,您不希望有成千上万的管理员同时管理您的站点。
  • 对于 Y 来说,这更难。Django ORM 正在阻止自己。

最好的方法 - 不要将 Django ORM 与龙卷风一起使用。

第二种方式 - 如果您确定它不会阻塞整个应用程序,您可以更深入地研究并将其直接集成到龙卷风中。从此答案中 获取解决方案。

第三种方式 - 你可以将你的 django 应用程序转换为服务,这使得 ORM 工作繁重,你可以AsyncHTTPCLient从 tornado 访问这个服务。

第四种方式 - 将 tornado web 服务器集成到您的 django 应用程序中。实际上,它会给你带来小的性能提升。

第五种方式 - 使用两个 Tornado Web 服务器。听起来很疯狂,是的。使用一个与 Django ORM 集成,第二个与AsyncHTTPClient.

我相信,你可以两全其美。

于 2012-07-30T13:27:26.743 回答
5

Django 不是异步的,因此在 Tornado 中运行 Django 将消除您可能从 Tornado 获得的大部分性能优势。

如果您想要最大的异步性能,您应该使用 Tornado 和非阻塞数据库(我假设您希望 Django admin 与 SQL 数据库一起使用)。

如果您想最大限度地简化开发,请使用 Django,它的 ORM 系统和管理工具。

不幸的是,你不能只是混合两全其美。

所以,是的,你会失去性能。在这种情况下,我可能会使用 Tornado 并放弃 Django admin。如果您对折衷方案一无所知,您可以编写两个应用程序,共享一个数据库,但这意味着您需要维护两个数据访问层。

于 2012-01-06T15:57:24.193 回答