Haskell에서 상위 프로세스와 분기된 하위 프로세스 간에 데이터를 어떻게 공유합니까?
-
04-07-2019 - |
문제
처음에 Haskell을 사용하여 하위 프로세스를 포크하려면 어떻게 해야 할까요?
또한 파이프가 데이터 공유 문제에 대한 확실한 해결책이라면 파이프를 사용하는 것 외에 다른 방법이 있습니까?나는 C의 공유 메모리 세그먼트(shmget, *shmat, shmdt 및 shmctl 함수) 사용에 익숙합니다.하스켈이 이것을 모방할 수 있을까요?그렇다면 어떻게?
도움을 주시면 정말 감사하겠습니다.
나는 함수형 프로그래밍 언어에 대해 매우 익숙하지 않다는 점을 인정해야 합니다. Haskell에 관해서라면 더욱 그렇습니다.그러므로 제가 어리석은 말을 했다면 용서해 주십시오(그리고 정정해 주십시오).
해결책
더 나은 것은 소프트웨어 트랜잭션 메모리, 즉 TVARS 및 TCHANNEL을 사용하십시오.
동일한 책인 다른 장을 추천합니다. http://book.realworldhaskell.org/read/software-transactional-memory.html
다음은이 기술의 좋은 작은 예입니다. http://sequence.complete.org/node/257
다른 팁
OP는 스레드가 아닌 하위 프로세스와의 의사 소통에 대해 물었습니다. 이를 위해 파이프는 완벽하게 좋은 방법입니다. 원한다면 Haskell에서 직접 C 라이브러리 기능을 호출 할 수도 있지만 까다로울 수 있습니다.
이 질문은 여기에 더 나은 답변이 있습니다. 프로세스 커뮤니케이션을 다루는 표준 Haskell 라이브러리가 있습니까?
MVAR 또는 채널을 사용하십시오. RealWorld Haskell의 24 장을 참조하십시오. http://book.realworldhaskell.org/read/concurrent-and-multicore-programming.html
실제로 프로세스를 Unix 스타일로 분기하려면 다음을 사용해야 합니다. forkProcess
에 의해 주어진대로 http://hackage.haskell.org/package/unix-2.4.2.0/docs/System-Posix-Process.html
이 경우 MVar 및 TVar는 프로세스 간 통신을 수행하지 않으므로 IPC를 수행하는 데 사용할 수 없습니다.IPC(파이프, 소켓 등)의 모든 표준 기술은 여전히 작동합니다.좀 더 높은 수준의 것을 원한다면 Cloud Haskell을 확인하십시오. http://www.haskell.org/haskellwiki/Cloud_Haskell