使用 WebSocket 库避免多线程问题

Avoiding multithreading issues with the WebSocket library

关于从多个线程发送消息的WebSockets library contains an open issue
例如,我看了一下 websocket-shootout, and noticed a forked thread for 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 个线程:

我的方法有没有明显的错误?

请注意,报告的问题仅在使用压缩时才会出现。 websocket-shootout 示例使用 Ws.defaultConnectionOptions,这意味着压缩被禁用。只要您还禁用压缩,就不会 运行 遇到任何与此问题相关的问题。