确保IO计算在特定线程中运行

时间:2013-12-10 11:36:58

标签: haskell

我需要确保某些操作在特定的OS线程上运行。我写了一个API,这个线程运行一个循环,监听TQueue并执行给定的命令。从API用户端,有一个不透明的值,实际上只是这个队列的新类型。

一个问题是我真正需要的是嵌入任意操作(类型IO a),但我相信我不能直接交换那种类型的消息。所以我现在有这样的东西(伪代码):

makeSafe :: RubyInterpreter -> IO a -> IO (Either RubyError a)
makeSafe (RubyInterpreter q) a = do
    mv <- newEmptyTMVarIO
    -- embedded is of type IO (), letting me send this in my queue
    let embedded = handleErrors a >>= atomically . putTMVar mv
    atomically (writeTQueue q (SomeMessage embedded))
    atomically (readTMVar mv)

(更多详细信息,这是针对hruby包)

编辑 - 澄清:

  • 能够发送IO a类型的动作会更好,但不是我的主要目标。
  • 我的主要问题是你可以用这个API射击自己,例如,如果IO动作中有一个makeSafe调用作为参数传递,这将会挂起。
  • 我的第二个问题是这个解决方案感觉有点做作,我想知道是否有更好/更安全的解决方案。

0 个答案:

没有答案