Go 멀티플렉서는 어떻게 여러 입력 채널에서 공정하고 안전한 액세스를 보장할 수 있습니까?

Patricia Arquette
풀어 주다: 2024-11-23 09:12:23
원래의
556명이 탐색했습니다.

How Can a Go Multiplexer Ensure Fair and Safe Access Across Multiple Input Channels?

동등한 액세스를 제공하는 채널 멀티플렉서

이 Go 멀티플렉서는 여러 채널의 출력을 하나로 병합하여 각 입력 채널이 출력 채널에 대한 동일한 권리. 그러나 제공된 테스트에서는 예상치 못한 결과가 나왔습니다.

문제 분석

중요한 문제는 Mux 함수에서 생성된 고루틴에 있습니다. 각 입력 채널을 나타내기 위한 채널 매개변수 c는 루프가 반복될 때마다 업데이트됩니다. 이는 모든 고루틴이 의도한 개별 채널이 아닌 동일한 채널에서 가져오게 됨을 의미합니다.

해결책

이 문제를 해결하려면 고루틴 생성 루프를 수정하여 통과하도록 수정하세요. 각 고루틴에 대한 올바른 채널:

for _, c := range channels {
    go func(c <-chan big.Int) {
        ...
    }(c)
}
로그인 후 복사

이를 통해 각 고루틴은 채널이 생성될 때 문제를 제거하고 원하는 결과를 생성합니다.

동시성 안전성 향상

출력 채널에 대한 동등한 액세스를 보장하는 것 외에도 동시성 안전을 보장합니다. 초기 코드는 int 변수 n을 사용하여 입력 채널 닫기를 추적합니다. 그러나 GOMAXPROCS가 1보다 크면 여러 고루틴이 n에 동시에 액세스하여 잠재적으로 경쟁 조건이 발생할 수 있습니다.

더 안전한 접근 방식은 고루틴이 서로를 기다릴 수 있도록 하는 sync.WaitGroup 객체를 사용하는 것입니다. n이 안전하게 업데이트되도록 보장합니다. sync.WaitGroup을 사용하여 수정된 코드:

import (
    "math/big"
    "sync"
)

// ... other code ...

// The channel to output to.
ch := make(chan big.Int, len(channels))

var wg sync.WaitGroup
wg.Add(len(channels))

// ... other code ...

// Close the channel when the pumping is finished.
go func() {
    // Wait for everyone to be done.
    wg.Wait()
    // Close.
    close(ch)
}()
로그인 후 복사

이러한 수정을 통해 이제 멀티플렉서가 올바르고 안전하게 작동하여 모든 입력 채널이 출력 채널에 동일하게 액세스하고 경쟁 조건을 방지할 수 있습니다.

위 내용은 Go 멀티플렉서는 어떻게 여러 입력 채널에서 공정하고 안전한 액세스를 보장할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿