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退出后 其余的协程也退出了 不会一直打印直到主进程退出

  • 相关阅读:
    [转]java.lang.OutOfMemoryError: Java heap space内存不足问题
    xx
    HTTP协议详解--(转)
    树的子结构
    合并两个排序的链表
    链表反转
    环的入口节点
    链表中倒数第k个节点 (相关的 单链表的中间节点!)
    正则表达式
    表示数值的字符串
  • 原文地址:https://www.cnblogs.com/wangxusummer/p/4229418.html
Copyright © 2011-2022 走看看