我需要确保某些操作在特定的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
类型的动作会更好,但不是我的主要目标。makeSafe
调用作为参数传递,这将会挂起。