Golang:如何发送信号并停止向 goroutine 发送值

Golang: how to send signal and stop sending values to a goroutine

我是新手,我正在尝试学习 goroutine 中信号函数的一些基本用法。我在 go 中有一个无限循环。通过这个 for 循环,我通过通道将值传递给 goroutine。 我也有一个阈值,超过该阈值我想停止无限期地向 goroutine 发送值(即关闭通道)。 当达到阈值时,我想打破for循环。以下是我目前尝试过的方法。

在此特定示例中,thresholdValue = 10 并且我想打印 0 , ..., 9 中的值然后停止。

我关注了this post on medium and this post on Whosebug。我从这些帖子中挑选了我可以使用的元素。

这就是我目前所做的。 在我的代码的main函数中,我特意把for循环变成了无限循环。我的主要目的是学习如何让 goroutine readValues() 获取阈值,然后无限期地停止在通道中传输值。

package main

import (
    "fmt"
)

func main() {
        ch := make(chan int)
        quitCh := make(chan struct{}) // signal channel
        thresholdValue := 10 //I want to stop the incoming data to readValues() after this value 

        go readValues(ch, quitCh, thresholdValue)
       

    for i:=0; ; i++{
        ch <- i
    }
    
}

func readValues(ch chan int, quitCh chan struct{}, thresholdValue int) {
    for value := range ch {
        fmt.Println(value)
        if (value == thresholdValue){
            close(quitCh)
        }
    }
}

我代码中的 goroutine 仍然没有达到阈值。对于我应该如何从这里开始的任何指示,我将不胜感激。

为了表示诚意,程序重写了

package main

import (
    "log"
    "sync"
    "time"
)

func main() {
    ch := make(chan int, 5) // capacity increased for demonstration
    thresholdValue := 10

    var wg sync.WaitGroup
    wg.Add(1)
    go func() {
        readValues(ch)
        wg.Done()
    }()

    for i := 0; i < thresholdValue; i++ {
        ch <- i
    }
    close(ch)
    log.Println("sending done.")
    wg.Wait()

}

func readValues(ch chan int) {
    for value := range ch {
        <-time.After(time.Second) // for demonstratin purposes.
        log.Println(value)
    }
}

在此版本中 readValues 退出 因为 for 循环确实退出并且 main 关闭 ch.

换句话说,停止条件生效并触发退出序列(信号end of input然后等待处理完成)