我正在为某个订阅队列的客户端实施一个管道来源,并将所有到达的消息放入一个MVar。
问题是我无法通过管道来源从那个MVar读取yield
这些消息,因为它报告了运行时的异常:thread blocked indefinitely in an MVar operation
mqttSource :: (Monad m, MonadIO m, MonadResource m) => MqttOptions -> Source m String
mqttSource MqttOptions {..} = do
bracketP mkConsumer cleanConsumer runHandler
where
mkConsumer = do
chan <- liftIO $ newEmptyMVar
client <- liftIO.hookToChan $ chan
return (chan, client)
cleanConsumer (_, client) =
liftIO.disconnectClient $ client
runHandler (chan, client) = do
newMsg <- liftIO $ readMVar chan
yield newMsg
runHandler (chan, client)
(hookToChan
告诉客户端使用此函数订阅队列:\topic msg -> putMVar chan (show msg)
)
答案 0 :(得分:1)
感谢Cirdec的评论,我已经设法解决了这个问题。
问题是我在同一个线程中产生了客户端。
hookToChan
负责这样做,我正在同一个线程上订阅队列。我刚刚在forkIO
函数中添加了hookToChan
,问题就消失了。