Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Mengutamakan Saluran dalam Penyata Pilihan Go?

Bagaimanakah Saya Boleh Mengutamakan Saluran dalam Penyata Pilihan Go?

Patricia Arquette
Lepaskan: 2024-12-01 09:06:14
asal
310 orang telah melayarinya

How Can I Prioritize Channels in Go's Select Statement?

Melaksanakan Keutamaan dalam Pernyataan Pilih Go

Pernyataan pilih Go membolehkan goroutines memultipleks pada berbilang saluran, memproses data daripada saluran yang menjadi sedia terlebih dahulu . Walau bagaimanapun, ia tidak menyokong saluran keutamaan. Artikel ini meneroka senario pengaturcaraan biasa di mana seseorang ingin mengutamakan saluran tertentu berbanding yang lain dalam pernyataan terpilih.

Dalam contoh yang diberikan, goroutine menghantar data ke dua saluran, keluar dan keluar. Walaupun kedua-dua saluran pada mulanya kosong, tujuannya adalah untuk memberi keutamaan supaya semua nilainya diproses sebelum mengendalikan keluar. Menggunakan pernyataan pilih standard, seperti yang dilihat dalam soalan, tidak mencapai tingkah laku yang diingini ini.

Untuk menangani isu ini, Go menyediakan penyelesaian yang elegan. Daripada bergantung pada keutamaan terbina dalam pilih, saluran yang harus diutamakan (dalam kes ini, keluar) harus boleh diakses hanya kepada goroutine penghantar. Apabila goroutine penghantar bersedia untuk ditamatkan, ia menutup saluran. Gorutin penerima, menggunakan gelung berasaskan julat untuk lelaran ke atas saluran (untuk x := val julat), akan terus memproses data sehingga saluran ditutup.

Melaksanakan penyelesaian ini menghasilkan kod berikut:

package main

import (
    "fmt"
    "math/rand"
    "time"
)

var (
    produced  = 0
    processed = 0
)

func produceEndlessly(vals chan int, quit chan bool) {
    defer close(vals)
    for {
        select {
        case vals <- rand.Int():
            produced++
        case <-quit:
            return
        }
    }
}

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)
}
Salin selepas log masuk

Dalam kod yang dikemas kini ini, saluran keluar hanya disampaikan daripada goroutine penghantar. Ini memastikan bahawa berhenti tidak akan dipilih sehingga pengirim bersedia untuk ditamatkan. Akibatnya, goroutine penerima akan kehabisan semua data daripada vals sebelum mengendalikan keluar.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengutamakan Saluran dalam Penyata Pilihan Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan