【问题标题】:concurrent connections in tornado龙卷风中的并发连接
【发布时间】:2012-11-05 19:15:08
【问题描述】:

我有一个在龙卷风上运行的服务器。我有一个向同一服务器打开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()

我可以做一些可以让我建立多个连接的事情吗?

【问题讨论】:

    标签: python django mod-wsgi tornado


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      是的,这是 Tornado 的正常行为,以防您尝试在其中运行 Django 等重度阻塞应用程序。

      您当然应该在不同的操作系统进程中运行 django 和 tornado。特别是如果你使用 Django ORM。

      需要我描述原因吗?

      【讨论】:

      • 不是为什么,而是如何?如果它们运行在不同的进程中,它们将如何通信?
      • @prongs:通过某种 RPC(JSON-RPC/原始 HTTP 或某种 unix/tcp 套接字)。例如,您可以在 tornado 中添加一些内部 RPC url,例如 /send_realtime_message,然后从 django 中调用它,例如 urllib.request("http://tornado/send_realtime_message?user=user&messahe=Hello")。但是在 Django 应用程序和 Tornado 服务器之间进行多次通信并不是一个好主意。
      • Python 进程也可以通过使用队列共享数据进行通信:docs.python.org/3/library/queue.html
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多