我有一段处理文件的代码,
processFiles :: [FilePath] -> (FilePath -> IO ()) -> IO ()
此函数生成执行IO操作的异步进程。必须通过作业调度系统(例如Slurm)将此IO操作提交给集群。
因为我必须使用作业调度系统,所以不可能使用cloudHaskell来分发闭包。相反,程序会编写一个包含所需计算的新 Main.hs ,即与主要依赖的所有模块一起复制到集群节点,然后使用“runhaskell Main.hs”远程执行它。选择采用]”。然后,如果作业完成,异步过程应定期询问作业调度系统(使用 threadDelay )。
有没有办法避免创建新的Main?我可以序列化IO操作并以某种方式在节点中执行吗?
答案 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
的注意事项是:
Binary
可能会很大。评估thunk可以解决这个问题。除此之外,这看起来像你想要的!