채널 멀티플렉싱
이 문서에서는 채널 배열의 출력을 단일 채널로 병합하기 위한 멀티플렉서 기능에 대해 설명합니다. 그러나 제공된 구현에는 기능을 방해하는 몇 가지 문제가 있습니다.
원본 코드:
func Mux(channels []chan big.Int) chan big.Int { // Count down as each channel closes. When hits zero - close ch. n := len(channels) // The channel to output to. ch := make(chan big.Int, n) // Make one go per channel. for _, c := range channels { go func() { // Pump it. for x := range c { ch <- x } // It closed. n -= 1 // Close output if all closed now. if n == 0 { close(ch) } }() } return ch }
구현 오류:
여러 고루틴에서 닫기: n 변수는 여러 고루틴에서 공유되며 각각에 의해 업데이트됩니다. 채널 폐쇄를 감지하면 고루틴을 실행합니다. 이로 인해 여러 고루틴이 n에 동시에 액세스하고 업데이트하려고 시도할 때 경쟁 조건과 예상치 못한 동작이 발생할 수 있습니다.
잘못된 채널 캡처: 루프에서 생성된 고루틴은 각각 동일한 채널(마지막 채널)을 캡처합니다. 채널 요소) c는 고루틴에 전달되지 않고 각 반복마다 채널 값이 할당되기 때문입니다. function.
해결된 문제:
이러한 문제를 해결하기 위해 수정된 코드는 더 안전한 기술을 사용합니다.
WaitGroup 사용: sync.WaitGroup은 고루틴 완료를 추적하는 데 사용됩니다. 각 고루틴은 데이터 펌핑이 완료되면 WaitGroup에 신호를 보내고 기본 고루틴은 출력 채널을 닫기 전에 모든 고루틴이 완료될 때까지 기다립니다.
올바른 채널 캡처: 각 고루틴은 채널을 전달합니다. 각 고루틴이 할당된 것을 올바르게 모니터링하도록 람다 함수 내에서 수신해야 합니다. 채널.
향상된 출력: 수정된 코드는 모든 채널이 균등하게 분포되어 출력 채널에 기여하는 예상 출력을 생성합니다. 원래 출력에서 관찰된 순차적 공급이 제거됩니다.
추가 고려 사항:
위 내용은 경쟁 조건 및 데이터 손실을 방지하기 위해 여러 Go 채널을 올바르게 다중화하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!