WebSockets庫包含一個關于從多個執行緒發送訊息的未解決問題。
作為一個例子,我查看了websocket-shootout,并注意到了一個用于receiveData的分叉執行緒。
void $ fork $ silentLoop (Unagi.readChan readEnd >>= Ws.sendTextData conn)
silentLoop $ do
msg <- Ws.receiveData conn
case parseMsg msg of
Nothing -> Ws.sendClose conn ("Invalid message" :: LByteString)
Just Echo -> Ws.sendTextData conn msg
Just (Broadcast res) -> do
Unagi.writeChan writeEnd msg
Ws.sendTextData conn res
我從未解決的問題中得到的印象是這會引起問題。假設從多個執行緒使用sendTextData
只是不安全的,這是否安全?
在我的實際后端服務器中,我為每個連接創建 3 個執行緒:
- 通過withPingThread Ping 執行緒
- “消費者”執行緒,它
receiveData像上面的例子一樣輪詢 - “生產者”執行緒,它從
TQueue訊息中輪詢給定連接,并通過sendTextData. 該執行緒是為了允許多個執行緒為單個連接排隊訊息,而只有單個執行緒(該執行緒)向客戶端發送文本資料(除了receiveData也可以從消費者執行緒發送文本資料) .
我的方法有什么明顯的錯誤嗎?
uj5u.com熱心網友回復:
請注意,報告的問題僅在使用壓縮時才是問題。該websocket-shootout示例使用Ws.defaultConnectionOptionswhich 表示禁用壓縮。只要您還禁用壓縮,就不會遇到此問題的任何問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/436372.html
上一篇:對于可折疊產品
