golang select 退出结束goroutine

wangxusummer · 2015-01-22 13:00:01 · 10502 次点击 · 预计阅读时间 1 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2015-01-22 13:00:01 的文章,其中的信息可能已经有所发展或是发生改变。

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


有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:wangxusummer

查看原文:golang select 退出结束goroutine

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

10502 次点击  
加入收藏 微博
1 回复  |  直到 2000-01-01 00:00:00
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传