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

标签 go goroutine

我正在尝试在无限循环中启动 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/

相关文章:

go - 如何将 [1024]C.char 转换为 [1024]byte

Go:如何创建类型为 schema.ResourceData 的实例以进行单元测试?

go - 处理超时并收听 channel

pointers - 使用匿名 go 函数在循环内传递指针会导致仅使用最后一个元素指针

go - 在没有锁的情况下并发读取函数指针是否安全?

windows - 如何避免http包合并?

arrays - 结构问题中的 Golang 数组

go - 从本地系统获取当前位置区域

go - 为什么 goroutine 会泄漏

go - 对goroutines中的延迟感到困惑