gpt4 book ai didi

select - Go select 语句解决方法中的优先级

转载 作者:IT老高 更新时间:2023-10-28 13:00:33 27 4
gpt4 key购买 nike

我希望在两个 channel 上进行常规收听,当两个 channel 都耗尽时被阻塞。但是,如果两个 channel 都包含数据,我希望在处理另一个 channel 之前先耗尽一个 channel 。

在下面的工作示例中,我希望在处理 exit 之前将所有 out 排空。我使用没有任何优先顺序的 select 语句。我该如何解决这个问题,在退出前处理所有 10 个输出值?

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")
}

最佳答案

该语言 native 支持此功能,无需解决方法。很简单:退出 channel 应该只对生产者可见。退出时,生产者关闭 channel 。只有当 channel 为空且关闭时,消费者才会退出。这可以通过对 channel 进行测距来实现。

这里有一个例子来说明:

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)
}

关于select - Go select 语句解决方法中的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11117382/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com