【问题标题】:Django and Websockets: How to create, in the same process, an efficient project with both WSGI and websockets?Django 和 Websockets:如何在同一进程中创建一个同时使用 WSGI 和 websockets 的高效项目?
【发布时间】:2015-01-12 07:26:46
【问题描述】:

我正在尝试使用异步部分做一个 Django 应用程序:Websockets。作为一个小挑战,我想在同一个过程中安装所有内容。尝试了 Socket.IO,但无法真正使用套接字,而不是长轮询(它多次杀死我的浏览器,直到我放弃)。

然后我尝试的是一个基于 gevent-websocket 的维护不那么好的库。但是,有很多错误,不容易调试。

现在我正在尝试 Tornado 方法,但是 AFAIK(如果我错了,请纠正我)将异步与由 WSGIContainer 包装的常规 django 应用程序集成(websockets 将通过 Tornado,通过 Django 进行常规连接)将成为真正的服务器杀手如果资源很重,或者不知何故,Django ORM 会缓慢地进入繁重的操作。

我正在考虑转到 Twisted/Cyclone。在我从一个存在此类问题的架构转移到另一个存在此类问题的架构之前,我想问一下:

Tornado(和/或 Twisted)是否具有与 Gevent 相同的调度任务架构?(这意味着:当某些 greenlet “阻塞”时,它们会将自己调度到其他线程,在至少直到操作完成)。我问这个是因为(如果我错了,请纠正我)常规的 django 视图不适合 @inlineCallbacks 之类的东西,并且会导致整个服务器被阻塞(包括 websockets)。

我是 python 异步编程的新手,所以有一个巨大的变化,我对多个概念有错误的信息。请在我切换之前帮助我澄清这一点。

【问题讨论】:

  • +1 表示非常有趣的主题。今天在 Django 中处理 websocket 的正确方法是什么并不明显。
  • 在我看来,这是一场噩梦。当我认为我找到了完美的架构(在一篇博客文章中)时,我了解到 Tornado 不支持开箱即用的 greenlets 之类的东西,并发出 WSGI 请求(Django WSGI 请求有点繁重,并且出于某些目的它们应该是,尽管它们可以得到严重改进)会阻塞整个服务器。不知道该怎么办xDDDD。

标签: django websocket twisted tornado


【解决方案1】:

Tornado 和 Twisted 都没有像 gevent 那样运行(某些)具有异步代码性能特征的阻塞代码的魔法。 Tornado 或 Twisted 的惯用用法将以回调和/或 Futures/Deferreds 的形式在整个应用程序中可见。

一般来说,由于 GIL 的原因,您无论如何都需要运行多个 python 进程,因此通常最好使用 Tornado/Twisted 将一些进程专用于 websockets,而使用您选择的 WSGI 容器将其他进程专用于 Django(然后把 nginx 或 haproxy 放在前面,这样对外看起来就像是一个单一的服务)。

如果您仍想在同一进程中结合 django 和异步服务,下一个最佳解决方案是使用线程。如果您希望两者共享一个侦听端口,则侦听器必须是一个支持 websocket 的 HTTP 服务器,它可以为 WSGI 请求生成其他线程。 Tornado 还没有解决方案,尽管计划在 4.1 版 (https://github.com/tornadoweb/tornado/pull/1075) 中提供解决方案。我相信 Twisted 的 WSGI 容器确实支持在线程中运行 WSGI 工作者,但我自己没有任何经验。如果您在同一个进程中需要它们但不需要共享同一个端口,那么您可以简单地在一个线程中运行 IOLoop 或 Reactor,并在另一个线程中运行您选择的 WSGI 容器(及其关联的工作线程)。

【讨论】:

  • 我会去的。是按优先顺序排列的下一个。谢谢:D(希望这样的 pull/1075 以某种魔法结束,就像我问的那样,而不是线程)。可惜像我问的那样的解决方案还不存在:(。
猜你喜欢
  • 2013-07-12
  • 2016-11-06
  • 2014-05-17
  • 2022-01-11
  • 2012-10-19
  • 2014-10-02
  • 2011-11-24
  • 2019-05-04
  • 1970-01-01
相关资源
最近更新 更多