2016-11-29 111 views
1

我對Python不太熟悉,也不熟悉Tornado websockets,所以我有一個問題想要它是如何實際工作的。龍捲風websocket模型

具體而言,這是一個常用的例子:

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是非阻塞的,並且如果理解的很好,單線程,每個請求都以快速方式由處理程序處理,並且如果操作持續時間更長,那麼會在某些操作(例如數據庫)完成時調用回調。這允許大量的用戶被服務。但是,這些websockets和例子讓我困惑的是,在這種情況下,self是什麼?

我知道這是類似的東西,如這個在Java和C#中,但我不明白這個自我代表不同的客戶每次客戶端發送消息?而且,每個應用程序是否只有一個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") 

而且

class EchoWebSocket(tornado.websocket.WebSocketHandler): 

    def __init__(self, application, request): 
     super(EchoWebSocket,self).__init__(application, request) 
     self.clients = [] 

    def open(self): 
     print("WebSocket opened") 

    def on_message(self, message): 
     self.clients.append(self) 
     self.write_message(u"You said: " + message) 


    def on_close(self): 
     print("WebSocket closed") 

但是第二種做法似乎並不奏效。什麼是正確的方法來做到這一點,爲什麼?

回答

1

在Python中,按照慣例self是對當前類的實例對象的引用。

AFAIK,龍捲風框架爲每個客戶端創建一個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) 
+0

感謝您的回答。現在對我來說更加清楚了。但是,如果我想將消息從一個客戶端廣播到所有其他客戶端,我必須保留所有客戶端的列表,所以第一種方法和類別變量將是正確的。 – Marko

+0

當然,請參閱編輯答案。 –