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

Golang:如何发送信号并停止向goroutine发送值,go,channel,Go,Channel,我是新手,我正在努力学习goroutines中信号函数的一些基本用法。我有一个无限的for循环。通过这个for循环,我通过通道将值传递给goroutine我还有一个阈值,在此阈值之后,我希望停止无限期地将值发送到goroutine(即关闭通道)当达到阈值时,我希望打破for循环。以下是我迄今为止尝试的内容 在这个特定的例子中,thresholdValue=10,我想打印0、…、9中的值,然后停止 我跟着他走。我从这些帖子中挑选了我可以使用的元素 这就是我目前所做的在我代码的主要函数中,我有意将f

我是新手,我正在努力学习goroutines中信号函数的一些基本用法。我有一个无限的for循环。通过这个for循环,我通过通道将值传递给goroutine我还有一个阈值,在此阈值之后,我希望停止无限期地将值发送到goroutine(即关闭通道)当达到阈值时,我希望打破for循环。以下是我迄今为止尝试的内容

在这个特定的例子中,
thresholdValue=10
,我想打印
0、…、9
中的值,然后停止

我跟着他走。我从这些帖子中挑选了我可以使用的元素

这就是我目前所做的在我代码的主要函数中,我有意将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)
        }
    }
}
主程序包
进口(
“fmt”
)
func main(){
ch:=制造(成交量)
quitCh:=make(chan struct{})//信号通道
thresholdValue:=10//我想在此值之后停止readValues()的传入数据
go ReadValue(ch、quitCh、thresholdValue)
对于i:=0;;i++{

ch为了表示诚意,这是重新编写的程序

主程序包
进口(
“日志”
“同步”
“时间”
)
func main(){
ch:=make(chan int,5)//为演示增加了容量
阈值:=10
var wg sync.WaitGroup
工作组.添加(1)
go func(){
读取值(ch)
wg.Done()
}()
对于i:=0;i对于i:=0,使用ch
;对于i:=0,使用此
;i++{
,如果停止读取ch
(退出readValues)程序死锁。虽然您仍然可以在readValues中添加if语句,以不处理低于阈值的值……但您想要的答案不是
如何退出readValues
,而是
如何无限期停止发送值
@ConfusedScientist我不确定我是否完全理解您要查找的值,但也许这可以d帮助:我阅读原始问题的意思是
main
函数生成值,但
readValues
函数知道处理何时完成。您的示例假设
main
函数知道处理何时完成。由于该问题没有非学术目标,因此很难证明这一点
main
可以让用户知道何时达到阈值。@DanielFarrell让消费者决定何时停止处理(即:其调用者)是一个设计错误。通过tme,消费者已经向调用者发出了进程应该停止的信号,mre项目已经积累,但它们不会得到处理,因为消费者已经决定在其生产商之前停止。它将问题颠倒过来。这种设计的结果是更复杂的代码,更多的修补,更多的麻烦。我这是一种编写并发性的方法,可以帮助您防止一整类错误。我不能不同意这一点。+1