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操作并在节点中以某种方式执行它吗?
是的。有一个神奇的图书馆,叫做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
是:
Binary
可能也会很大。评估 thunk 可以解决这个问题。除此之外,这似乎就是您想要的!