Golang의 여러 채널에서 비동기 읽기
Go에서 고루틴은 병렬 프로그래밍에서 중요한 역할을 합니다. 최적의 성능을 달성하기 위해 여러 채널에서 동시에 데이터를 읽어야 하는 경우가 종종 있습니다.
다음 시나리오를 고려해보세요. 고루틴 numgen1과 numgen2는 각각 채널 num1과 num2에 동시에 숫자를 씁니다. 여러분의 임무는 이러한 채널에서 읽고 해당 값을 추가하고 결과를 새 채널 sum에 쓰는 새로운 고루틴 addnum을 만드는 것입니다.
처음에는 다음과 같은 해결 방법을 시도할 수 있습니다.
func addnum(num1, num2, sum chan int) { done := make(chan bool) go func() { n1 := <-num1 // Read from channel done <- true // Signal completion }() n2 := <-num2 // Read from channel <-done // Wait for completion sum <- n1 + n2 // Write to destination channel }
그러나 이 접근 방식은 두 채널 모두에서 동시 읽기를 보장하지 않기 때문에 결함이 있습니다.
해결책: select 사용
보다 효율적인 솔루션 여러 채널에서 비차단 읽기를 수행할 수 있는 Go의 select 키워드를 사용합니다.
func addnum(num1, num2 <-chan int, sum chan<- int) { for { select { case n1 := <-num1: select { case n2 := <-num2: sum <- n1 + n2 default: // Store value back in channel num1 <- n1 } case n2 := <-num2: select { case n1 := <-num1: sum <- n1 + n2 default: // Store value back in channel num2 <- n2 } } } }
이 코드에서 for 루프는 무기한 실행되어 num1 또는 num2의 데이터를 지속적으로 수신합니다. 한 채널에서 데이터가 수신되면 내부 선택은 다른 채널에서 읽기를 시도합니다. 성공하면 값이 추가되어 합계 채널에 전송됩니다.
참고:
위 내용은 Golang에서 동시에 여러 채널의 데이터를 효율적으로 읽는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!