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