管道来源取决于MVar

时间:2018-02-11 23:20:41

标签: haskell concurrency conduit

我正在为某个订阅队列的客户端实施一个管道来源,并将所有到达的消息放入一个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)

1 个答案:

答案 0 :(得分:1)

感谢Cirdec的评论,我已经设法解决了这个问题。

问题是我在同一个线程中产生了客户端。

hookToChan负责这样做,我正在同一个线程上订阅队列。我刚刚在forkIO函数中添加了hookToChan,问题就消失了。