>백엔드 개발 >Golang >Go의 `select` 문에서 채널 읽기의 우선순위를 어떻게 지정할 수 있나요?

Go의 `select` 문에서 채널 읽기의 우선순위를 어떻게 지정할 수 있나요?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-09 10:21:06804검색

How Can I Prioritize Channel Reads in Go's `select` Statement?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.