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

bar*_*lle 5 haskell

我需要确保某些操作在特定的OS线程上运行。我编写了一个API,该线程在其中运行一个循环,监听a 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)
Run Code Online (Sandbox Code Playgroud)

(有关更多详细信息,这是针对hruby软件包的)

编辑-澄清:

  • 能够发送类型的动作IO a会更好,但这不是我的主要目标。
  • 我的主要问题是,您可以使用此API makeSafe步履蹒跚,例如,如果IO操作中有一个调用作为参数传递,则该调用将挂起。
  • 我的第二个问题是,这种解决方案感觉有些虚构,我想知道周围是否有更好或更安全的解决方案。