zoukankan      html  css  js  c++  java
  • 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退出后 其余的协程也退出了 不会一直打印直到主进程退出

  • 相关阅读:
    HihoCoder1371
    Intern Day23
    腾讯移动客户端开发暑期实习一面笔试
    C++
    朱丹为什么是文艺青年
    金数据一个不错的调查平台
    单反手动对焦M档,AV,TV,P,A,A-DEP
    chrome不支持字体12px
    火狐解决字体模糊
    《程序员的自我修养》阅读笔记(四):
  • 原文地址:https://www.cnblogs.com/wangxusummer/p/4229418.html
Copyright © 2011-2022 走看看