Golang의 동시성 및 채널 통신: 여러 채널에서 동시에 읽기
Golang 영역에서는 동시에 여러 채널. 이 특정 쿼리는 두 개의 이동 루틴(numgen1 및 numgen2)이 동시에 별도의 채널(num1 및 num2)에 숫자를 쓰는 '다대일' 채널 설정 구성에 중점을 두고 있으며 목표는 세 번째 이동에서 이러한 숫자를 집계하는 것입니다. -routine(addnum).
다음을 고려하세요.
<code class="go">func addnum(num1, num2, sum chan int) { done := make(chan bool) go func() { n1 := <-num1 done <- true }() n2 := <-num2 <-done sum <- (n1 + n2) }</code>
문제:
안타깝게도 코드 조각은 제공된 결함이 있습니다. 이는 폴링 메커니즘에 의존하며 교착 상태에 빠지기 쉽습니다.
해결책:
이 문제에 대한 강력한 해결책은 select 문을 사용하는 것입니다.
<code class="go">func main() { c1 := make(chan int) c2 := make(chan int) out := make(chan int) go func(in1, in2 <-chan int, out chan<- int) { for { select { case n1 := <-in1: out <- n1 case n2 := <-in2: out <- n2 } } }(c1, c2, out) }</code>
설명:
select 문은 데이터가 입력 채널 중 하나에 도착할 때까지 효과적으로 차단하여 본질적으로 일대일 채널을 생성합니다. 데이터를 사용할 수 있게 되면 즉시 출력 채널을 통해 전송됩니다.
이 방법은 데이터가 예측할 수 없는 간격으로 두 채널 중 하나에 도착할 수 있는 상황을 우아하게 처리합니다. 또한 두 소스의 입력을 지속적으로 기다리므로 교착 상태의 위험을 제거합니다.
방향성 채널 유형을 고루틴 기능의 형식 매개변수로 활용하는 것을 기억하세요. 이 방법은 컴파일러가 부적절한 채널 사용을 방지하도록 하여 코드 안전성을 향상시킵니다.
이러한 통찰력을 통해 이제 Golang에서 동시 채널 통신을 자신 있게 관리할 수 있습니다.
위 내용은 Go의 여러 채널에서 동시에 읽는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!