使用 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 个线程:
- Ping 线程通过 withPingThread
- “消费者”线程,它像上面的例子一样用
receiveData
轮询
- “生产者”线程,它从
TQueue
消息中轮询给定连接,并通过 sendTextData
发送消息。
这个线程是为了让多个线程为单个连接排队消息,而只有一个线程(这个线程)向客户端发送文本数据(除了receiveData也可以发送文本数据,从消费者线程) .
我的方法有没有明显的错误?
请注意,报告的问题仅在使用压缩时才会出现。 websocket-shootout
示例使用 Ws.defaultConnectionOptions
,这意味着压缩被禁用。只要您还禁用压缩,就不会 运行 遇到任何与此问题相关的问题。
关于从多个线程发送消息的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 个线程:
- Ping 线程通过 withPingThread
- “消费者”线程,它像上面的例子一样用
receiveData
轮询 - “生产者”线程,它从
TQueue
消息中轮询给定连接,并通过sendTextData
发送消息。 这个线程是为了让多个线程为单个连接排队消息,而只有一个线程(这个线程)向客户端发送文本数据(除了receiveData也可以发送文本数据,从消费者线程) .
我的方法有没有明显的错误?
请注意,报告的问题仅在使用压缩时才会出现。 websocket-shootout
示例使用 Ws.defaultConnectionOptions
,这意味着压缩被禁用。只要您还禁用压缩,就不会 运行 遇到任何与此问题相关的问题。