我對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")
但是第二種做法似乎並不奏效。什麼是正確的方法來做到這一點,爲什麼?
感謝您的回答。現在對我來說更加清楚了。但是,如果我想將消息從一個客戶端廣播到所有其他客戶端,我必須保留所有客戶端的列表,所以第一種方法和類別變量將是正確的。 – Marko
當然,請參閱編輯答案。 –