Distribuir Haskell en un cluster
closures distributed (1)
Tengo un trozo de código que procesa archivos,
processFiles :: [FilePath] -> (FilePath -> IO ()) -> IO ()
Esta función genera un proceso asíncrono que ejecuta una acción IO. Esta acción de E / S debe enviarse a un clúster a través de un sistema de programación de trabajos (por ejemplo, Slurm).
Debido a que debo usar el sistema de programación de trabajos, no es posible usar cloudHaskell para distribuir el cierre. En su lugar, el programa escribe un nuevo Main.hs que contiene los cálculos deseados, es decir, copia al nodo del clúster junto con todos los módulos de los que depende el principal y luego se ejecuta de forma remota con "runhaskell Main.hs [opts]". Luego, el proceso asíncrono debe preguntar periódicamente al sistema de programación de trabajos (mediante threadDelay ) si el trabajo está terminado.
¿Hay alguna manera de evitar crear una nueva Main? ¿Puedo serializar la acción IO y ejecutarla de alguna manera en el nodo?
Sí. Hay una biblioteca mágica llamada packman
. Le permite convertir cualquier cosa de haskell en datos (siempre y cuando no tenga IORef
s o cosas relacionadas en ellos). Aquí encontrará las cosas que necesitaría:
trySerialize :: a -> IO (Serialized a)
deserialize :: Serialized a -> IO a
instance Typeable a => Binary (Serialized a)
Sí, esos son los tipos exactos. Puede empaquetar sus acciones de IO
utilizando trySerialize
, usar Binary
para transferirlo a cualquier lugar y luego deserialize
para obtener la acción de IO, lista para su uso.
Las advertencias para packman
son que:
- Almacena cosas como thunks. Esto es probablemente lo que quieres, para que el nodo pueda hacer la evaluación.
- Dicho esto, si tu thunk es enorme, el
Binary
probablemente será enorme. Evaluando el procesador puede arreglar esto. - Como dije, las referencias mutables son un no-no. Una cosa a tener en cuenta es que estén dentro de Thunks sin que usted lo sepa.
- Dicho esto, si tu thunk es enorme, el
Aparte de eso, esto parece ser lo que quieres!