在群集上分发Haskell

fel*_*pez 18 distributed closures haskell

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

processFiles ::  [FilePath] -> (FilePath -> IO ()) -> IO ()
Run Code Online (Sandbox Code Playgroud)

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

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

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

PyR*_*lez 1

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

trySerialize :: a -> IO (Serialized a)
deserialize :: Serialized a -> IO a
instance Typeable a => Binary (Serialized a)
Run Code Online (Sandbox Code Playgroud)

是的,这些都是确切的类型。您可以使用 打包您的IO操作trySerialize,使用Binary将其传输到任何地方,然后deserialize将 IO 操作取出以供使用。

注意事项packman是:

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

除此之外,这似乎就是您想要的!