Подтвердить что ты не робот

Распространение Haskell на кластере

У меня есть часть кода, обрабатывающая файлы,

processFiles ::  [FilePath] -> (FilePath -> IO ()) -> IO ()

Эта функция запускает процесс async, который выполняет действие ввода-вывода. Это действие IO должно быть отправлено в кластер через систему планирования заданий (например, Slurm).

Поскольку я должен использовать систему планирования заданий, невозможно использовать cloudHaskell для распространения закрытия. Вместо этого программа записывает новый файл Main.hs, содержащий требуемые вычисления, то есть скопируйте в кластер node вместе со всеми основными модулями, и это выполняется удаленно с помощью "runhaskell Main.hs [opts]". Затем процесс async должен периодически запрашивать систему планирования заданий (используя threadDelay), если задание выполняется.

Есть ли способ избежать создания нового Main? Могу ли я сериализовать действие ввода-вывода и выполнить его каким-либо образом в node?

4b9b3361

Ответ 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 заключаются в следующем:

  • Он хранит вещи как трюки. Вероятно, это то, что вы хотите, так что node может выполнить оценку.
    • Тем не менее, если ваш тэк огромный, Binary, вероятно, будет огромным. Оценка thunk может исправить это.
    • Как я уже сказал, изменчивые ссылки - нет-нет. Единственное, что нужно уяснить, это то, что они находятся в трюках, не зная об этом.

Кроме этого, это похоже на то, что вы хотите!