Python 龙卷风网筒模型
我对Python和Tornado websockets不太熟悉,所以我很难理解它实际上是如何工作的 具体来说,这是一个常见的例子:Python 龙卷风网筒模型,python,websocket,tornado,Python,Websocket,Tornado,我对Python和Tornado websockets不太熟悉,所以我很难理解它实际上是如何工作的 具体来说,这是一个常见的例子: class EchoWebSocket(tornado.websocket.WebSocketHandler): def open(self): print("WebSocket opened") def on_message(self, message): self.write_message(u"You said
class EchoWebSocket(tornado.websocket.WebSocketHandler):
def open(self):
print("WebSocket opened")
def on_message(self, message):
self.write_message(u"You said: " + message)
def on_close(self):
print("WebSocket closed")
让我困惑的是这些请求的处理方式。我读到Tornado是非阻塞的,如果理解得很好,它是单线程的,每个请求都由处理程序以一种快速的方式处理,如果操作持续时间更长,则在某些操作(例如数据库)完成时会调用回调。这允许为大量用户提供服务。但让我对这些WebSocket和示例感到困惑的是,在这种情况下,什么是self
我知道在Java和C#中类似于this,但我不明白每次客户端发送消息时,它如何表示不同的客户端?此外,是每个应用程序只有一个EchoWebSocket实例,还是每个请求都有一个实例
此外,我应该如何保存对客户的引用?我尝试了两种方法:
class EchoWebSocket(tornado.websocket.WebSocketHandler):
clients = []
def open(self):
print("WebSocket opened")
def on_message(self, message):
EchoWebSocket.clients.append(self)
self.write_message(u"You said: " + message)
def on_close(self):
print("WebSocket closed")
及
但第二种方法似乎不起作用。正确的方法是什么?为什么?在python中,按照惯例,self是对当前类的实例对象的引用 好的,tornado框架为每个客户机创建一个WebSocketHandler类的实例。所以你真的不必保留客户的参考资料。每个客户机自然由处理程序的不同实例处理。实际上,这意味着对于两个不同的客户端,
self
将是不同的对象
要保留对已连接客户端的引用,类似的操作将起作用:
class EchoWebSocket(tornado.websocket.WebSocketHandler):
all_clients = set()
def open(self):
self.all_clients.add(self)
def on_message(self, message):
pass
def on_close(self):
self.all_clients.remove(self)
谢谢你的回答。现在我更清楚了。但是,如果我想将消息从一个客户机广播到所有其他客户机,我必须保留一个所有客户机的列表,因此第一种方法,使用class变量,是正确的。
class EchoWebSocket(tornado.websocket.WebSocketHandler):
all_clients = set()
def open(self):
self.all_clients.add(self)
def on_message(self, message):
pass
def on_close(self):
self.all_clients.remove(self)