我有一段处理文件的代码,
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 可以解决这个问题。 - 就像我说的,可变引用是禁忌。需要注意的一件事是,他们在您不知情的情况下在里面重击。
- 也就是说,如果您的 thunk 很大,
除此之外,这似乎就是您想要的!
关于haskell - 在集群上分布 Haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29039815/