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
然后等待处理完成)
我是新手,我正在尝试学习 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
然后等待处理完成)