Python 龙卷风网筒模型

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

我对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: " + 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)