單獨一個websocket為什么會有線程安全問題?當有多個websocket連接的時候那個inchan和outchan是大家共用一個還是每人一個?
type Connection struct {
conn ? ?*websocket.Conn
inChan ?chan *Message
outChan chan *Message
mutex ? ? sync.Mutex
closeChan chan byte
}
type Connection struct {
conn ? ?*websocket.Conn
inChan ?chan *Message
outChan chan *Message
mutex ? ? sync.Mutex
closeChan chan byte
}
2020-02-11
舉報
2020-06-19
1、一個連接建立后,3個協成是同一個結構體變量的方法,該結構體中的屬性在3個協成中可見可操作。因為結構體的方法是引用傳值【func (wsConn *wsConnection)】
2、不是共用的,每個連接都是創建了一個局部結構體變量保存數據和方法調用。連接間沒有共用數據。
希望小魚兒老師看看我理解的是否有偏差呢
作者的程序是服務端啟動后,就會監聽一個端口等待客戶端連接,每來一個客戶端就會在wsHandler處理函數中
建立連接。并使用局部結構體變量wsConn包含了連接和讀寫管道,讀寫管道和這個通信長連接都在這個局部結構體變量中,啟動的處理、讀、寫協成都是調用的該結構體方法。且需引用傳值,保證操作的是同一個地址空間,同一個結構體變量。
打開多個客戶端網頁,會產生多個連接,每個連接對應自己的客戶端。每個連接的處理都在自己的結構體方法中完成。從客戶端發送消息,服務端讀到什么再發回給對應客戶端,不會跑到別的客戶端網頁上。
如果服務端想給所有客戶端群發消息,可以將wsConn局部變量保存在一個全局數組中或者redis等存儲介質中,
遍歷所有連接發送數據。
如果將讀 寫管道換成全局變量,某個客戶端發送數據被對應連接協成放入到inchan管道后,會隨機被某個連接的協成讀取并放入全局outchan管道中,再被該連接的協成從outchan管道取走發送給該連接對應客戶端。
2020-02-28
個人理解
原來的websocket的話,每來一個請求都會調用同一個conn對象writeMessage應答,此時會競爭寫writeMessage發消息的緩沖區內容。就會有線程安全問題
第二個問題的話。共用一個。因為用channel的話,確保每次我只處理一個消息(channel相當于一個管道,一個個投遞數據,一個個處理)