Tornado中的并发连接

3
我有一个运行在tornado上的服务器。我有一个页面打开了与同一服务器的websocket连接。现在我观察到打开多个此页面实例会使它们全部等待,除了其中一个。只有在那个完成它的websocket后,另一个才会开始。这是正常的tornado行为还是我做错了什么?
以前我的服务器正在使用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

你需要研究一下Tornado中的异步功能,才能使其正常工作。Tornado在其正常状态下是一个单线程堆栈,因此您只能一次处理一个连接。

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

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

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

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


-1

是的,这是正常的Tornado行为,特别是当您尝试在其中运行像Django这样的重型阻塞应用程序时。

您绝对应该在单独的操作系统进程中运行Django和Tornado。特别是如果您使用Django ORM。

我需要描述原因吗?


不是为什么,而是如何?如果它们在不同的进程中运行,它们将如何通信? - prongs
1
@prongs:通过某种RPC方式(如JSON-RPC/raw HTTP或某种unix/tcp套接字)。例如,您可以在tornado中添加一些内部RPC URL,例如/send_realtime_message,然后从django中调用它,例如urllib.request("http://tornado/send_realtime_message?user=user&messahe=Hello")。但是,在Django应用程序和Tornado服务器之间进行多个通信并不是一个好主意。 - seriyPS
Python进程也可以通过使用队列共享数据来进行通信:https://docs.python.org/3/library/queue.html - Edison

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接