golang select 退出结束goroutine

wangxusummer · · 7896 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

开启了多个协程 其中一个协程满足条件后终止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中文网 QQ交流群:798786647 或 加微信入微信群:274768166 备注:入群; 公众号:Go语言中文网

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