golang select 退出結束goroutine

開啓了多個協程 其中一個協程知足條件後終止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退出後 其他的協程也退出了 不會一直打印直到主進程退出協程

相關文章
相關標籤/搜索