我有一段处理文件的代码,
processFiles :: [FilePath] -> (FilePath -> IO ()) -> IO ()此函数派生执行IO操作的异步进程。此IO操作必须通过作业调度系统(例如Slurm)提交到群集。
因为我必须使用作业调度系统,所以不能使用cloudHaskell来分发闭包。相反,程序编写一个包含所需计算的新Main.hs,即复制到群集节点以及main所依赖的所有模块,然后使用"runhaskell Main.hs opts“远程执行。然后,异步进程应定期向作业调度系统(使用threadDelay)询问作业是否已完成。
有没有办法避免创建新的Main?我可以序列化IO操作并以某种方式在节点中执行它吗?
发布于 2015-12-02 08:29:35
是啊。有一个神奇的库叫做packman。它允许您将任何haskell内容转换为数据(只要其中没有IORef或相关内容)。下面是你需要的东西:
trySerialize :: a -> IO (Serialized a)
deserialize :: Serialized a -> IO a
instance Typeable a => Binary (Serialized a)是的,这些就是确切的类型。您可以使用trySerialize打包您的IO操作,使用Binary将其传输到任何位置,然后使用deserialize获取IO操作,以备使用。
packman的注意事项是:
Binary可能也会很大。评估thunk可以解决这个问题。的情况下就在thunks里面
除此之外,这似乎就是你想要的!
https://stackoverflow.com/questions/29039815
复制相似问题