카테고리 없음
[자바 스크립트] MVars를 사용하여 Haskell에서 이벤트 스트림 구현
행복을전해요
2021. 2. 24. 18:55
Haskell 프로그램을 실행하면 메인 스레드가 종료되는 즉시 종료됩니다. 약간의 경쟁 조건이 있습니다. getEvent
의 자식 스레드는 프로세스가 종료되기 전에 많은 작업을 수행하려고합니다.
한 가지 간단한 수정 사항은 가져 오기 행을 추가 한 import Control.Monad (forever)
다음 끝에 다음을 main
실행하는 것입니다.
forever $ threadDelay maxBound
그러면 메인 스레드가 영원히 잠들게됩니다. 더 나은 접근 방식은 실제 응용 프로그램의 목적에 따라 다릅니다.
-------------------Michael의 대답 대신 async
여러 가지 훌륭한 동시성 패턴을 구현하는 라이브러리를 사용할 수 있습니다 . 특히 우리는
async :: IO a -> IO (Async a)
IO
다른 스레드에서 입력 작업 을 실행 하고 즉시 Async
래핑 된 반환 값을 반환합니다. 분명히 우리는 a
자식 프로세스가 완료 될 때까지 충분히 기다릴 때까지 그것을 얻을 수 없지만 즉각적인 반환을 통해 자식 프로세스의 탄생과 완료를 기다리는 사이에 무언가를 할 수 있습니다.
-- | "Work".
work :: Int -> IO ()
work n = threadDelay (n * 10000)
do ret <- async $ do work 100 -- do some "work"
return True
putStrLn "Not waiting on the child process yet; doing other work"
work 5
putStrLn "Now we wait"
_ <- wait ret
여기서 요점은 메인 스레드의 모든 자식 스레드를 시작하여 async
종료가 허용되기 전에 모든 반환 값을 기다리도록 할 수 있다는 것입니다.
귀하의 경우 자녀는 결코 돌아 오지 않으므로 프로그램이 중단 될 때까지 주 스레드가 행복하게 멈출 것입니다.
출처
https://stackoverflow.com/questions/22080087