【问题标题】:Is it possible to run several instances of hint in parallel?是否可以并行运行多个提示实例?
【发布时间】:2012-09-28 12:34:23
【问题描述】:

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

提示似乎没有我可以启动它的功能并保持它很好地等待以后使用。

(Auto)Plugins 当然是另一种选择,但我认为它更适合模块,而对于较小的计算不太优雅。

【问题讨论】:

    标签: haskell


    【解决方案1】:

    GHC api,它的hint是根据(各种插件包也是)实现的,不支持并发使用。

    不过,您可以让提示继续运行。这是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
    

    (我没有对此进行测试,所以我可能遗漏了一两个细节,但基本的想法是可行的。)

    【讨论】:

    • 谢谢。我认为使用插件在这里会有所不同,因为据我了解,插件是经过编译的,然后可以并行运行?
    • @JFritsch 不。这种方式根本没有区别。您可以加载带有提示的函数。加载后,可以同时对函数进行多次评估。只是加载本身不能同时完成。
    猜你喜欢
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 2020-05-30
    • 1970-01-01
    • 2014-02-22
    相关资源
    最近更新 更多