簡體   English   中英

龍卷風中的並發連接

[英]concurrent connections in 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()

我可以做一些可以讓我連接的東西嗎?

您需要查看龍卷風中的Asych設施才能使其正常工作。 Tornado中的正常狀態是單線程堆棧,因此您一次只能處理一個連接。

您可以使用普通的@asynchronous裝飾器或使用它們的gen庫來允許您的代碼處理多個連接。

裝飾者: http//www.tornadoweb.org/documentation/web.html#decorators

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

如果您選擇使用@asynchronous裝飾器,請仔細閱讀文檔,因為您需要在完成連接后關閉連接。

是的,這是正常的Tornado行為,以防你嘗試運行像Django這樣的重型阻止應用程序。

你肯定應該在單獨的OS進程中運行django和tornado。 特別是如果你使用Django ORM。

我需要說明原因嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM