2012-09-27 141 views
3

有什么办法来启动两个提示口译和在运行时&随后指派较小的计算,以一个或其他?当我调用一个小表达式(例如键入一个网站)的提示时 - 没有可靠的测试 - 在我看来,开始/加载提示的时间大约是一秒钟。如果实例已经启动,那么第二个将被剃光。是否有可能运行提示的几个实例并行?

的暗示似乎也没有什么功能,我可以启动它,并把它很好地挂起,供以后使用。

(自动)插件将是当然的另外的选项,但我认为是更适合的模块和用于较小的计算更少雅致。

回答

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 

(我没有测试这一点,所以我可能已经错过了一个或两个细节,但其基本思想将工作)。

+0

感谢。我认为使用插件会在这里有所作为,因为我的理解插件已编译,并可以在以后并行运行? –

+0

@JFritsch号有以那种方式都没有区别。您可以使用提示加载函数。一旦加载,函数可以同时被多次评估。这只是加载本身,不能同时完成。 – Carl

相关问题