是否可以并行运行几个提示实例?

时间:2012-09-27 18:39:10

标签: haskell

有没有办法启动两个提示解释器,并在运行时&随后将较小的计算分配给其中一个或另一个?当我调用一个小表达式的提示(例如输入一个网站)然后, - 没有可靠的测试 - ,在我看来,似乎启动/加载提示的时间大约是一秒钟。如果实例已经启动,则第二个将被削减。

该提示似乎没有任何功能,我可以启动它并保持良好状态等待以后使用。

(自动)插件当然是另一种选择,但我认为它更适合模块而不适合较小的计算。

1 个答案:

答案 0 :(得分:2)

GHC api,暗示是以(各种插件包也是)实现的,不支持并发使用。

但是你可以让提示继续运行。这是MonadIO的实例。

interpreterLoop :: (MonadIO m, Typeable) a => Chan ((MVar a, String)) -> InterpreterT m ()
interpreterLoop ch = do
    (mvar, command) <- liftIO $ readChan ch
    a <- interpret command $ argTypeWitness mvar
    liftIO $ putMVar mvar a
    interpreterLoop ch
  where
    argTypeWitness :: MVar a -> a
    argTypeWitness = undefined -- this value is only used for type checking, never evaluated

runInLoop :: Typeable a => Chan ((MVar a, String)) -> String -> IO a
runInLoop ch command = do
    mvar <- newEmptyMVar
    writeChan ch (mvar, command)
    takeMVar mvar

(我没有对此进行测试,所以我可能错过了一两个细节,但基本想法会起作用。)