在群集上分发Haskell

时间:2015-03-13 18:50:36

标签: haskell closures distributed

我有一段处理文件的代码,

processFiles ::  [FilePath] -> (FilePath -> IO ()) -> IO ()

此函数生成执行IO操作的异步进程。必须通过作业调度系统(例如Slurm)将此IO操作提交给集群。

因为我必须使用作业调度系统,所以不可能使用cloudHaskell来分发闭包。相反,程序会编写一个包含所需计算的新 Main.hs ,即与主要依赖的所有模块一起复制到集群节点,然后使用“runhaskell Main.hs”远程执行它。选择采用]”。然后,如果作业完成,异步过程应定期询问作业调度系统(使用 threadDelay )。

有没有办法避免创建新的Main?我可以序列化IO操作并以某种方式在节点中执行吗?

1 个答案:

答案 0 :(得分:1)

是的。有一个名为packman的神奇图书馆。它允许你将任何haskell事物转换为数据(只要它没有IORef或相关的东西。)这里你需要的东西:

trySerialize :: a -> IO (Serialized a)
deserialize :: Serialized a -> IO a
instance Typeable a => Binary (Serialized a)

是的,这些是确切的类型。您可以使用IO打包trySerialize个操作,使用Binary将其转移到任何地方,然后deserialize将IO操作移出,准备好使用。

packman的注意事项是:

  • 它将事物存储为thunk。这可能是您想要的,因此节点可以进行评估。
    • 那就是说,如果你的thunk很大,那么Binary可能会很大。评估thunk可以解决这个问题。
    • 就像我说的,可变引用是禁忌。需要注意的一件事是他们在你知道的情况下在thunks 中。

除此之外,这看起来像你想要的!