開啓了多個協程 其中一個協程知足條件後終止select, 原覺得其餘的協程會在後臺系統中繼續悄悄運行 直到主進程關閉而關閉 。sql
作一實驗發現select 監聽退出 會關閉全部監聽的goroutinespa
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) }
輸出code
/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退出後 其他的協程也退出了 不會一直打印直到主進程退出協程