haskell - 在集群上分布 Haskell

标签 haskell closures distributed

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

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

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

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

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

最佳答案

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

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

是的,这些是确切的类型。您可以使用trySerialize打包您的IO操作,使用Binary将其传输到任何地方,然后反序列化到取出 IO 操作,准备使用。

packman 的注意事项是:

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

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

关于haskell - 在集群上分布 Haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29039815/

相关文章:

java - 为什么 haskell 的性能比 java 差

string - 在 Haskell 中生成下一个字典字符串

haskell - 为什么有时可以从右侧折叠无限列表?

algorithm - 异步分布式模型中Bellman-Ford算法的终止

algorithm - Paxos 的真实世界示例

haskell - 这个斐波那契序列函数是递归的吗?

lambda - C++0x 闭包的未定义行为 : I

ios - 为什么相同的闭包类型没有被分配

swift - 命令因信号 : Segmentation fault: 11 while emitting IR SIL function 而失败

java - 基于mvc的分布式系统,我采用哪种设计模式或思想