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

У меня есть сервер веб-сокетов, написанный на торнадо Python. сервер будет получать много подключений от клиентов, и, как вы знаете, у нас есть функция on_message, которая запускается при получении сообщения веб-сокета. Итак, вот мой вопрос: если сообщение (скажем, запрос от клиента) должно обрабатываться в течение 5 секунд, то когда сервер обрабатывает какой-либо запрос, сервер переходит в режим блокировки и не может принять или получить больше соединения или данных. после некоторого исследования я понял, что Asyncio может решить мою проблему, но я не знаю, как ее использовать. Итак, как мне вызвать метод process, чтобы избежать блокировки?

следующий мой код:

class WavesClient(tornado.websocket.WebSocketHandler):
    def check_origin(self, origin):
        return True
    def open(self):
        print("New client connected")

   def on_message(self, message):
        self.process(message)

   def on_close(self):
        print("Client disconnected")
   def process(self,message):
        #it takes 5 sec to complete

1 Ответ

0 голосов
/ 04 июля 2018

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

Теперь к вашему коду:

@tornado.gen.coroutine
def on_message(self, message):
    process_results = yield self.process(message)
    self.write_message(process_results)

@tornado.gen.coroutine
def process(self, message):
    # a long process, this is the equivalent of time.sleep(2) which is blocking
    yield tornado.gen.sleep(2)
    return 'finished'

С tornado вам нужно yield из функции, чтобы получить возвращаемое значение. Кроме того, если ваша функция уступает, вы должны обернуть ее, используя tornado.gen.coroutine декоратор

Этот вопрос похож на ваш. И ответ также информативен.

...