Как можно разделить данные между родительским и разветвленным дочерним процессом в Haskell?
-
04-07-2019 - |
Вопрос
Как бы я вообще начал разветвлять дочерний процесс с использованием Haskell?
Кроме того, если каналы являются очевидным решением вопроса совместного использования данных, есть ли другой способ сделать это, кроме использования каналов? Я знаком с использованием сегментов разделяемой памяти в C (функции shmget, * shmat, shmdt и shmctl). Может ли Хаскелл подражать этому? Если да, то как?
Я был бы очень благодарен за любую помощь, которую вы можете сэкономить.
Я должен признать, что я очень плохо знаком с функциональными языками программирования, особенно в том, что касается Haskell. Так что прости меня (и, пожалуйста, поправь меня), если я сказал что-то глупое.
Решение
Еще лучше, используйте программную транзакционную память, то есть TVars и TChannels. Р>
Рекомендую одну и ту же книгу, другую главу: http: // book. realworldhaskell.org/read/software-transactional-memory.html р>
Вот хороший небольшой пример этой техники в действии: http://sequence.complete.org / узел / 257 р>
Другие советы
ОП спросил о связи с подпроцессом, а не с потоком. Для этого трубы - прекрасный способ сделать это. Вы также можете вызвать функцию библиотеки C непосредственно из Haskell, если хотите, хотя это может быть сложно.
На этот вопрос лучше ответить здесь: Существует ли какая-либо стандартная библиотека на Haskell, связанная с взаимодействием процессов?
используйте MVars или каналы. Смотрите главу 24 из RealWorld Haskell: http://book.realworldhaskell.org/read/concurrent-and- многоядерный-programming.html р>
Если вы хотите на самом деле форкнуть процесс в стиле Unix, вам нужно использовать forkProcess
, как указано в http://hackage.haskell.org/package/unix-2.4.2.0/docs/System-Posix-Process.html р>
В этом случае MVars и TVars не осуществляют межпроцессное взаимодействие, поэтому их нельзя использовать для IPC. Все стандартные методы для IPC (трубы, розетки и т. Д.) Все еще работают. Если вы хотите что-то более высокого уровня, посмотрите Cloud Haskell http://www.haskell.org/haskellwiki/ Cloud_Haskell