首頁 > 後端開發 > Golang > 如何在 Go 的 select 語句中優先考慮通道讀取?

如何在 Go 的 select 語句中優先考慮通道讀取?

Mary-Kate Olsen
發布: 2024-12-09 10:21:06
原創
801 人瀏覽過

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

Go select 語句優先權解決方法

考慮以下場景:您希望Go 程式監視兩個通道,當兩個通道都處於阻塞狀態時,保持阻塞狀態空的。但是,當兩個通道都包含資料時,您需要先排空一個通道,然後再處理另一個通道。

原始問題:

在提供的程式碼範例中,您有一個輸出通道和一個出口通道。您希望在處理退出訊號之前處理所有輸出值。但是,select 語句沒有內建的優先權機制。

解決方案:

Go 原生支援這種優先級,無需解決方案。解決方案包括使退出通道僅可供生產者存取。當生產者完成時,它關閉退出通道。消費者繼續從 out 通道讀取數據,直到它為空並且退出通道關閉。

修改後的程式碼如下所示:

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)
}
登入後複製

說明:

修改後的程式碼中,只有生產者goroutine 可以存取退出通道。當生產者完成時,它關閉退出通道。消費者 goroutine 繼續從 out 通道讀取數據,直到它為空並且退出通道關閉。這可確保在消費者退出之前處理所有輸出值。

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

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