python tornado websocket 服务器中的瓶颈

bottleneck in python tornado websocket server

我有一个用 python tornado 编写的 websocket 服务器。服务器将从客户端接收许多连接,如您所知,我们有 on_message 函数,当收到 websocket 消息时会触发该函数。所以,这是我的问题,如果一条消息(比如来自客户端的请求)需要 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

我主要使用 tornado 来托管我的 web 应用程序,因此我可以告诉您,如果您在 tornado 中的任何部分代码阻塞,整个服务器都会阻塞。

现在输入您的代码:

@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 获取 return 值。 此外,如果您的函数正在屈服,则必须使用 tornado.gen.coroutine 装饰器

包装它

这个与你的相似。答案也很丰富。