gpt4 book ai didi

go - 在一定时间内从 goroutine 接收值

转载 作者:数据小太阳 更新时间:2023-10-29 03:23:48 26 4
gpt4 key购买 nike

我有一个 goroutine,它可以生成无限数量的值(每个值都比最后一个更合适),但是找到每个值所需的时间越来越长。我试图找到一种方法来添加时间限制,比如 10 秒,之后我的函数会执行一些迄今为止收到的最佳值。

这是我当前的“解决方案”,使用 channel 和计时器:

// the goroutine which runs infinitely
// (or at least a very long time for high values of depth)
func runSearch(depth int, ch chan int) {
for i := 1; i <= depth; i++ {
fmt.Printf("Searching to depth %v\n", i)
ch <- search(i)
}
}

// consumes progressively better values until the channel is closed
func awaitBestResult(ch chan int) {
var result int
for result := range ch {
best = result
}

// do something with best result here
}

// run both consumer and producer
func main() {
timer := time.NewTimer(time.Millisecond * 2000)

ch := make(chan int)

go runSearch(1000, ch)
go awaitBestResult(ch)

<-timer.C
close(ch)
}

这主要是有效的——最好的结果是在计时器结束和 channel 关闭后处理的。然而,我随后从 runSearch goroutine 得到了一个 panic ( panic :在关闭的 channel 上发送),因为主函数已经关闭了 channel 。

如何在计时器完成后停止运行第一个 goroutine?非常感谢任何帮助。

最佳答案

您需要确保 goroutine 知道它何时完成处理,这样它就不会尝试写入已关闭的 channel 并发生 panic 。

这听起来像是 context 的完美案例包裹:

func runSearch(ctx context.Context, depth int, ch chan int) {
for i := 1; i <= depth; i++ {
select {
case <- ctx.Done()
// Context cancelled, return
return
default:
}
fmt.Printf("Searching to depth %v\n", i)
ch <- search(i)
}
}

然后在 main() 中:

// run both consumer and producer
func main() {
ctx := context.WithTimeout(context.Background, 2 * time.Second)

ch := make(chan int)

go runSearch(ctx, 1000, ch)
go awaitBestResult(ch)

close(ch)
}

关于go - 在一定时间内从 goroutine 接收值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47878994/

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