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
装饰器
包装它
这个与你的相似。答案也很丰富。
我有一个用 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
装饰器
这个