gpt4 book ai didi

go - 无限的 goroutines 直到收到期望的响应

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

我正在尝试在无限循环中启动 goroutines,直到我得到我正在寻找的响应,但是 select如果我更改 for i := 0; i < 10; i++ {} 则无法访问至 for {} .解决这个问题的模式是什么?

package main

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

func myFunc() float64 {

c := make(chan float64)

for i := 0; i < 10; i++ {
go func() {

var value float64
value = someOp()

if value > .9 {
c <- value
}

}()
}

// unreachable code the if the for loop above is infinite
for {
select {
case x := <-c:
return x
default:
}
}

}

func someOp() float64 {
rand.Seed(time.Now().UnixNano())
return rand.Float64()
}

func main() {
fmt.Println(myFunc())
}

最佳答案

启动无限数量的 goroutines 通常不是一个好主意。更好的方法是启动固定数量的 goroutine,这些 goroutine 会循环寻找答案。当找到答案时从这些 goroutines 返回。

func myFunc() float64 {
c := make(chan float64, 1) // Size 1 prevents race between main goroutine and workers

done := make(chan struct{})
defer close(done)

// Start a fixed number of goroutines
for i := 0; i < 10; i++ {
go func() {
for {
select {
case <-done:
// myfunc exited with result, return from this goroutine
return
default:
var value float64
value = someOp()
if value > .9 {
select {
case c <- value:
// This is first goroutine to send a value
default:
// Another goroutine sent a value
}
return
}

}
}
}()
}
return <-c
}

https://play.golang.org/p/SRpeT8k34eA

关于go - 无限的 goroutines 直到收到期望的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50426204/

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