Go select 문 우선 순위 해결 방법
다음 시나리오를 고려하십시오. Go 루틴이 두 채널을 모니터링하고 두 채널이 모두 차단된 경우 차단된 상태를 유지하려고 합니다. 비어 있는. 그러나 두 채널 모두에 데이터가 포함되어 있으면 다른 채널을 처리하기 전에 한 채널을 비우는 것을 우선시합니다.
원래 문제:
제공된 코드 샘플에는 출력 채널이 있습니다. 그리고 출구 채널. 종료 신호를 처리하기 전에 모든 출력 값을 처리하려고 합니다. 그러나 select 문에는 우선 순위 메커니즘이 내장되어 있지 않습니다.
해결 방법:
Go는 기본적으로 이 우선 순위를 지원하므로 해결 방법이 필요하지 않습니다. 해결 방법은 제작자만 종료 채널에 액세스할 수 있도록 만드는 것입니다. 생산자가 작업을 마치면 종료 채널을 닫습니다. 소비자는 out 채널이 비어 있고 quit 채널이 닫힐 때까지 계속해서 읽습니다.
수정된 코드는 다음과 같습니다.
package main import ( "fmt" "math/rand" "time" ) var ( produced = 0 processed = 0 ) func produceEndlessly(out chan int, quit chan bool) { defer close(out) for { select { case <-quit: fmt.Println("RECV QUIT") return default: out <- rand.Int() time.Sleep(time.Duration(rand.Int63n(5e6))) produced++ } } } func main() { vals, quit := make(chan int, 10), make(chan bool) go produceEndlessly(vals, quit) for x := range vals { fmt.Println(x) processed++ time.Sleep(time.Duration(rand.Int63n(5e8))) } fmt.Println("Produced:", produced) fmt.Println("Processed:", processed) }
설명:
수정된 코드에서는 생산자 고루틴만이 quit 채널에 접근할 수 있습니다. 생산자가 작업을 마치면 종료 채널을 닫습니다. 소비자 고루틴은 out 채널이 비어 있고 quit 채널이 닫힐 때까지 계속해서 out 채널을 읽습니다. 이렇게 하면 소비자가 종료되기 전에 모든 출력 값이 처리됩니다.
위 내용은 Go의 `select` 문에서 채널 읽기의 우선순위를 어떻게 지정할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!