开启了多个协程 其中一个协程满足条件后终止select, 原以为其他的协程会在后台系统中继续悄悄运行 直到主进程关闭而关闭 。
做一实验发现select 监听退出 会关闭所有监听的goroutine
package main import ( "fmt" "time" ) var stop bool = false func main() { ch := make(chan int, 0) ch2 := make(chan int, 0) defer func() { close(ch) close(ch2) }() go func() { ch <- 1 }() for i := 0; i <= 20; i++ { go func(ch2 chan int) { for { fmt.Println(time.Now().Unix()) ch2 <- 1 if stop { fmt.Println("sqlpop stop") return } } }(ch2) } L: for { select { case m := <-ch: fmt.Println(m) stop = true time.Sleep(time.Second * 2) break L case <-ch2: } } time.Sleep(time.Second * 10) }
输出
/data/GoPro/src/test/test [/data/GoPro/src/test] 1421401239 1421401239 1421401239 1421401239 1421401239 1421401239 1421401239 1421401239 1421401239 1421401239 1421401239 1421401239 1421401239 1 成功: 进程退出代码 0.
原以为输出1后回继续打印时间 但实际select退出后 其余的协程也退出了 不会一直打印直到主进程退出