golang select 退出结束goroutine

开启了多个协程 其中一个协程满足条件后终止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退出后 其余的协程也退出了 不会一直打印直到主进程退出

posted @ 2015-01-16 17:58  wangxusummer  阅读(3531)  评论(1编辑  收藏  举报