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