首頁 > 後端開發 > Golang > 如何在 Go 的 select 語句中決定通道的優先權?

如何在 Go 的 select 語句中決定通道的優先權?

Patricia Arquette
發布: 2024-12-03 03:18:13
原創
375 人瀏覽過

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

Go Select 語句中的優先權

使用 Go 的 select 語句處理多個通道時,不保證處理通道的順序。要優先考慮一個通道而不是另一個通道,可以使用解決方法。

問題陳述

在下面的程式碼片段中,目標是確保輸出通道中的所有值在退出通道之前進行處理:

package main

import "fmt"

func sender(out chan int, exit chan bool){
    for i := 1; i <= 10; i++ {
        out <- i
    }
    exit <- true
}

func main(){
    out := make(chan int, 10)
    exit := make(chan bool)

    go sender(out, exit)

    L:
    for {
        select {
            case i := <-out:
                fmt.Printf("Value: %d\n", i)
            case <-exit:
                fmt.Println("Exiting")
                break L
        }
    }
    fmt.Println("Did we get all 10? Most likely not")
}
登入後複製

但是,使用select 語句不會為一個通道提供高於其他通道的優先權其他。

解決方案:原生語言支援

Go 本身支援透過將「退出」通道的可見性限制為僅生產者來在select 語句中對通道進行優先級排序。當生產者決定退出時,它會關閉頻道。只有當通道為空並關閉時,消費者才會退出。

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 quitRandomly(quit chan bool) {
    d := time.Duration(rand.Int63n(5e9))
    fmt.Println("SLEEP", d)
    time.Sleep(d)
    fmt.Println("SEND QUIT")
    quit <- true
}

func main() {
    vals, quit := make(chan int, 10), make(chan bool)
    go produceEndlessly(vals, quit)
    go quitRandomly(quit)
    for x := range vals {
        fmt.Println(x)
        processed++
        time.Sleep(time.Duration(rand.Int63n(5e8)))
    }
    fmt.Println("Produced:", produced)
    fmt.Println("Processed:", processed)
}
登入後複製

在這個例子中,退出通道只對生產者函數(productEndless)可見。生產者在一定延遲後隨機決定退出。消費者函數(main)迭代 vals 通道,直到它關閉並為空。透過優先考慮生產者的「退出」訊息,在程式退出之前處理 vals 通道中的所有值。

以上是如何在 Go 的 select 語句中決定通道的優先權?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板