두 개의 값 중 하나만 필요하고, 상황에 따라 어느 하나가 다른 것보다 훨씬 빠르게 생성 될 수있는 특정 최적화를 위해 Haskell에서 동시성을 사용하려고합니다.하스켈 병행 성 - 실제로 forkio는 비 결정적입니까?
나는 forkIO로 2 개의 스레드를 실행할 수 있다고 생각하고 값이 MVar에 위치 할 때까지 기다렸다.
import Control.Concurrent
main = do out <- newEmptyMVar
t1 <- forkIO (makeString out)
t2 <- forkIO (makeInt out)
v <- takeMVar out
killThread t1
killThread t2
case v of
Left s -> putStrLn s
Right i -> putStrLn $ show i
makeString out = do s <- return (show (primes !! 10000))
putMVar out $ Left s
makeInt out = do i <- return 2
putMVar out $ Right i
primes = sieve [2..]
where sieve (x:xs) = x : (sieve $ filter ((/=0).(flip mod x)) xs)
컴파일 : 총리를 얻는 것은 makeInt에 대해 충분히해야하지만
그러나ghc --make -threaded Test
만 왼쪽의 경우 이제까지 도달 여기에 내가 이것을 위해 작성한 간단한 테스트입니다 스레드를 시작 (그리고 2 반환 정말 많은 시간이 걸릴해서는 안). 왜 그런가요? 어떻게 수정합니까?
코드를 어떻게 실행합니까? 기본적으로 haskell은 실제 OS 쓰레드보다는 가벼운 쓰레드를 사용합니다. 세부 사항을 모르지만 스케줄링 정책이 많이 바뀔 수 있습니다. –
사례에 맞지 않을 수도 있지만 "투기 적 병렬 처리"에 대한 작업 중 일부를 살펴볼 수도 있습니다. http://hackage.haskell.org/package/speculation – jberryman
FYI, http://hackage.haskell.org/package/monad-par는 그럼에도 불구하고 외부, 순수 병렬 처리 API를 제공합니다. 그럼에도 불구하고 명시 적으로 forks, join 등을 명시 할 수 있습니다. –