Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django和Websockets:如何在同一个过程中创建一个同时使用WSGI和Websockets的高效项目?_Django_Websocket_Twisted_Tornado - Fatal编程技术网

Django和Websockets:如何在同一个过程中创建一个同时使用WSGI和Websockets的高效项目?

Django和Websockets:如何在同一个过程中创建一个同时使用WSGI和Websockets的高效项目?,django,websocket,twisted,tornado,Django,Websocket,Twisted,Tornado,我正在尝试使用异步部分:Websockets来实现Django应用程序。作为一个小挑战,我想在同一个过程中装载所有东西。尝试了Socket.IO,但无法真正使用sockets,而不是longpolling(这几次扼杀了我的浏览器,直到我放弃) 然后我尝试了一个基于gevent websocket的维护不太好的库。但是,它有许多错误,不容易调试 现在我正在尝试一种Tornado方法,但是如果资源很重,或者django ORM在繁重的操作中运行缓慢,那么将async与WSGIContainer包装的

我正在尝试使用异步部分:Websockets来实现Django应用程序。作为一个小挑战,我想在同一个过程中装载所有东西。尝试了Socket.IO,但无法真正使用sockets,而不是longpolling(这几次扼杀了我的浏览器,直到我放弃)

然后我尝试了一个基于gevent websocket的维护不太好的库。但是,它有许多错误,不容易调试

现在我正在尝试一种Tornado方法,但是如果资源很重,或者django ORM在繁重的操作中运行缓慢,那么将async与WSGIContainer包装的常规django应用程序(websockets将通过Tornado,通过django的常规连接)集成在一起的AFAIK(如果我错了,请纠正我的错误)将是一个真正的服务器杀手

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

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


我不熟悉python中的异步编程,所以有一个巨大的变化,我对不止一个概念有误解。请在我切换之前帮我澄清一下。

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

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


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

+1用于非常有趣的主题。在Django,什么是处理WebSocket的正确方法现在还不是很明显。在我看来,这是一场噩梦。当我认为我找到了完美的体系结构(在一篇博客文章中)时,我了解到Tornado不支持开箱即用的greenlets之类的东西,并且发出WSGI请求(Django WSGI请求有点重,出于某些目的,它们应该是,尽管它们可能会得到严重改进)会阻塞整个服务器。我不知道该怎么办,我会去的。按优先顺序排在第二位。谢谢:D(希望这样的拉动/1075能像我所要求的那样以某种魔力结束,而不是以线结束)。遗憾的是,像我所问的那样的解决方案还不存在。