我试图在程序中嵌入一个ruby1.9解释器.我目前正在使用forkOS我的hruby软件包,但似乎这只适用于ruby 1.8和2.x. 看起来1.9需要在主线程中执行.作为一个侧节点,没有文档说明如何做这样的事情,因此唯一指向我当前问题的指针就在这里.
有没有办法控制主线程来运行我的所有FFI调用?
我需要确保某些操作在特定的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会更好,但这不是我的主要目标。makeSafe步履蹒跚,例如,如果IO操作中有一个调用作为参数传递,则该调用将挂起。haskell ×2