мульти торнадо веб-сокет блокируют друг друга - PullRequest
0 голосов
/ 24 октября 2018

все.В моем проекте я построил два подключения к веб-сокету.один используется для отправки изображений с сервера на клиент, а другой - для отправки некоторых управляющих данных с клиента на сервер.теперь я использую только один клиент.

var ws2 = new WebSocket('ws://xx.xx.xx.xx:9002/control')
var ws1 = new WebSocket('ws://xx.xx.xx.xx:9002/data')
ws.binaryType = 'blob'
ws2.onopen =()=> console.log('ws2 connected.')

На стороне сервера, когда ws1 открыт, он постоянно отправляет данные клиенту.q - глобальная очередь, из которой я получаю данные.Эта часть отлично работает.Проблема в том, что программа не может запустить on_message (self, message) в функции в ws2 после того, как я отправлю сообщение со стороны клиента.

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("index.html")

class myWebSocket(tornado.websocket.WebSocketHandler):
    def check_origin(self, origin):
        return True;

    def open(self):
    print "websocket1 open."
    while self.ws_connection is not None:
        print "send..."
        try:
            self.write_message(q.get(),True)
        except tornado.websocket.WebSocketClosedError:
            self.close()
    def on_message(self, message):
        print("websocket1 received message.")
        print message
    def on_close(self):
        print("websocket1 closed.")

class controlWebSocket(tornado.websocket.WebSocketHandler):
    def check_origin(self, origin):
        return True;
    def open(self):
        print "websocket2 open"

    def on_message(self, message):
        print("websocket2 received message.")
        print message

    def on_close(self):
        print("websocket2 closed.")

, и я уверен, что клиент успешно отправил управляющие данные с помощьюнажмите кнопку.

<script>
    function test(){
    ws2.send("this is from ws2.")
    alert("home clicked.")
    }
</script>

и я также обнаружил, что как только функция открытия в ws1 остановлена, ws2 может получить сообщение.Я не понимаю, почему отправка данных из-за ws1 привела к невозможности получения данных из-за ws2.

Я новичок в программировании на python и в веб-сокете торнадо.любой может помочь в решении этой проблемы, большое спасибо ~!

1 Ответ

0 голосов
/ 26 октября 2018

Торнадо построен на неблокирующем параллелизме .Это означает, что вы обычно должны избегать блокирующих методов (или запускать их в пуле потоков).q.get() - это метод блокировки, поэтому в Tornado больше ничего не может работать, пока он ожидает сообщения.Возможно, вам следует заменить эту очередь на tornado.queues.Queue.

...