Go 언어에는 여러 채널을 폴링하고 어떤 채널이 비어 있지 않은지에 따라 특정 작업을 수행하는 데 사용할 수있는 select
문이 있습니다.Haskell STM 채널에 대한 Go의 select 문을 구현하는 방법은 무엇입니까?
예. chanA
, chanB
또는 chanC
하나가 비어 때까지
select {
case a := <- chanA:
foo(a)
case b := <- chanB:
baz(b)
case c := <- chanC:
bar(c)
}
이는 예를 chanB
비 비어위한 경우, 그것은 chanB
에서 읽습니다, 대기 및 b
에 결과를 저장 한 후 baz(b)
를 호출합니다. default:
절도 추가 할 수 있습니다. 즉, select
문이 채널에서 대기하지 않고 대신 모든 채널이 비어있는 경우 default
절이 무엇이든합니다.
하스켈에서 STM TChan
을 구현하는 가장 좋은 방법은 무엇입니까? 그것은 if-else chain에 의해 순진하게 행해질 수 있습니다 : 각 채널이 isEmptyChan
인지 확인하고, 비어 있지 않다면 읽은 다음 적절한 함수를 호출하십시오. 그렇지 않으면 모든 채널이 비어있는 경우 retry
을 호출하십시오. 더 우아한/관용적 인 방법이 있을지 궁금 해서요?
Go의 select
문에는 해당 경우에 send 문도 포함될 수 있으며 채널이 비어있는 경우에만 send 문을 완료한다는 점에 유의하십시오. 비록 그렇게 할 수있는 우아한 방법이 있을지는 모르겠지만 기능이 복제 될 수 있다면 좋을 것입니다.
만 약간 관련이 있지만, 뭔가 난 그냥 눈치 내가 그것을 게시 할 경우 확실하지 않다 :
"구현 한 때까지 스레드를 차단할 수 : retry
에 대한 설명에서 Control.Monad.STM 페이지에 오타가있다 읽은 TVars 중 은입니다. "
'r 에이스'Control.Concurrent.Async'. –
go는 사용 가능한 첫 번째 작업을 수행하지 않지만 사용할 수있는 임의의 작업을 무작위로 수행한다는 점에 유의할 가치가 있습니다. 나중에 정의되었거나 선택 경로에서 불운하기 때문에 특별히 채널을 굶기는 않습니다. – Dustin
이것은 Go의'select'와는 완전히 다릅니다. Go의 채널은'TChan'과 달리 (실제로 유용하게 만들어집니다.)'select'는 보내기 작업과 함께 사용할 수 있습니다. – rightfold