2013-01-04 3 views
4

동일한 모나드 컨텍스트 (예 : Connection)에서 여러 동시 프로세스를 실행해야합니다. 나는 다음과 같이 일하는 것이 예상 :모나드에서 멀티 스레딩

main = runConnection connectionSettings $ do 
    forkIO action1 
    forkIO action2 
    action3 

하지만 forkIO 필요도 IO에 있어야하는 IO 상황과 행동에서 실행 할 수 있습니다.

이러한 작업의 유형이 :: Connection()이라면 동시에 실행하기 위해 수행해야 할 작업 (구현할 인스턴스 등)은 무엇입니까?

현재 나는 다음과 같이이 문제를 해결 일하고 있어요,하지만 분명히이 바로되지 않습니다 :

main = do 
    forkIO $ runConnection connectionSettings action1 
    forkIO $ runConnection connectionSettings action2 
    runConnection connectionSettings action3 
+0

의미있는 방식으로 전혀 수행 할 수 없다는 보장은 전혀 없습니다. 누구나 확실히 말할 수 있겠지만 '연결'이 무엇인지 말할 필요가 있습니다. –

+1

모나드 병렬을 보셨습니까? http://hackage.haskell.org/packages/archive/monad-parallel/0.7.1.1/doc/html/Control-Monad-Parallel.html –

+0

@ItaiZukerman 고맙습니다! 이것은 매우 유망한 것 같습니다. –

답변

3

나는 매우 유사한 목적을위한 아름다운 "monad-parallel" 라이브러리를 발견했습니다, 그리고 훨씬 더 강력한 포크의 그것 - "classy-parallel".

모나드를 병렬 가능하게 사용할 수 있으려면 Parallel 유형의 인스턴스가 있어야합니다. 그리고 "고급 병렬"라이브러리는 이미 이러한 목적을 위해 가장 중요한 유형 인 인스턴스 인 ResourceT IOReaderT을 제공합니다.

다음에 문제의 코드를 변환 할 수 적절한 인스턴스의 존재를 가정 :

import qualified Control.Monad.Parallel as Parallel 

main = runConnection connectionSettings $ 
    Parallel.sequence [action1, action2, action3] 

단순히 유용 할 수 있습니다 ResourceTresourceForkIO에서 분기 들어. 또한 forkIOresourceForkIO 위에 포크를 통해 깔끔하고 단순한 일반화를 제공하는 "monad-fork" 라이브러리가 있습니다.