package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
ch := make(chan int, 1)
send := func(m, n int) {
for i := m; i <= n; i++ {
ch <- i
}
wg.Done()
}
wg.Add(3)
go send(1, 10)
go send(11, 20)
go send(21, 30)
go func() {
for {
n, ok := <-ch
if !ok {
return
}
fmt.Println(n)
}
}()
wg.Wait()
close(ch)
}
共 5 个回复
stevewang
先把写的goroutine停下来就可以安全关闭channel了。 例如:
xiaolongren25
关键是不知道会有多少个goroutine去写channel,goroutine的数目是动态的
stevewang
用一个channel做控制就可以,写的goroutine在这个channel上收到信号就退出。
bigbear
把一个channel作为关闭信号, 传入到所有channel中, 当处理的channel不再处理消息时, 发出信号. 其他的channel收到信号后, 停止发送信号.
zweite
使用sync/atomic包对channel管理