龙卷风中的并发连接

时间:2012-11-05 19:15:09

标签: python django mod-wsgi tornado

我在龙卷风上运行服务器。我有一个页面打开websocket到同一台服务器。现在我已经观察到打开这个页面的多个实例使得所有实例都等待除了一个。只有在那个人完成了它的websocket之后,才开始另一个。这是正常的龙卷风行为,我做错了吗?

早些时候我的服务器运行django但我迁移到tornado以获得websocket支持。为此,我使用后备服务器作为django。

#!/usr/bin/env python

# Run this with
# PYTHONPATH=. DJANGO_SETTINGS_MODULE=testsite.settings testsite/tornado_main.py
# Serves by default at
# http://localhost:8080/hello-tornado and
# http://localhost:8080/hello-django

from tornado.options import options, define, parse_command_line
import django.core.handlers.wsgi
import tornado.httpserver
import tornado.ioloop
import tornado.web
import tornado.wsgi

define('port', type=int, default=8000)

class HelloHandler(tornado.web.RequestHandler):
  def get(self):
    self.write('Hello from tornado')

def main():
  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()

if __name__ == '__main__':
  main()

我可以做一些可以让我进行多次连接的事情吗?

2 个答案:

答案 0 :(得分:0)

您需要查看龙卷风中的Asych设施才能使其正常工作。 Tornado中的正常状态是单线程堆栈,因此您一次只能处理一个连接。

您可以使用普通的@asynchronous装饰器或使用它们的gen库来允许您的代码处理多个连接。

装饰者:http://www.tornadoweb.org/documentation/web.html#decorators

Gen:http://www.tornadoweb.org/documentation/gen.html

如果您选择使用@asynchronous装饰器,请仔细阅读文档,因为您需要在完成连接后关闭连接。

答案 1 :(得分:0)

是的,这是正常的Tornado行为,以防你尝试运行像Django这样的重型阻止应用程序。

你肯定应该在单独的操作系统进程中运行django和tornado。特别是如果你使用Django ORM。

我需要说明原因吗?