package main
import (
"fmt"
"time"
)
func main() {
N := 5
exit := make(chan struct{})
done := make(chan struct{}, N)
// start N worker goroutines
for i := 0; i < N; i++ {
go func(n int) {
for {
select {
// wait for exit signal
case x := <-exit:
fmt.Printf("worker goroutine #%d exit\n", n)
fmt.Printf("worker goroutine #%d exit\n", x)
done <- struct{}{}
return
case <-time.After(time.Second):
fmt.Printf("worker goroutine #%d is working...\n", n)
}
}
}(i)
}
close(exit) //关闭exit会导致N个goroutine都会收到关闭的信号
time.Sleep(5 * time.Second)
// broadcast exit signal
//close(exit)
// wait for all worker goroutines exit
//for i := 0; i < N; i++ {
// <-done
//}
fmt.Println("main goroutine exit")
}
//结果:
//worker goroutine #4 exit
//worker goroutine #{} exit
//worker goroutine #2 exit
//worker goroutine #{} exit
//worker goroutine #3 exit
//worker goroutine #{} exit
//worker goroutine #1 exit
//worker goroutine #{} exit
//worker goroutine #0 exit
//worker goroutine #{} exit
//main goroutine exit
//Process finished with the exit code 0
golang close一个channel 发生广播,可以控制多个goroutine
最新推荐文章于 2023-07-30 21:46:05 发布