• golang channel select


    尝试多个channel同时触发时,select的表现:

    package main
    
    import (
        "fmt"
        "time"
    )
    
    func loop(ch chan int){
        for i := 0; i < 10; i++ {
            ch <- i
        }
        close(ch)
    }
    
    func main() {
        ch1 := make(chan int, 100)
        ch2 := make(chan int, 100)
        
        go loop(ch1)
        go loop(ch2)
        
        for{
            select{
                case j, ok := <- ch2:
                    if false == ok {
                        goto End
                    }
                    fmt.Println("ch2", j)
                    
                case i,ok := <- ch1:
                    if false == ok {
                        goto End
                    }
                    fmt.Println("ch1", i)
                    
                case <-time.After(5 * time.Second):
                    fmt.Println("time's up")
                    goto End
            }
        }
        
        End:
        fmt.Println("finish!")
        
    }

    输出

    ch1 0
    ch1 1
    ch1 2
    ch1 3
    ch1 4
    ch1 5
    ch1 6
    ch1 7
    ch1 8
    ch1 9
    finish!


    package main
    
    import (
        "fmt"
        "time"
    )
    
    func loop(ch chan int){
        for i := 0; i < 10; i++ {
            ch <- i
        }
        close(ch)
    }
    
    func main() {
        ch1 := make(chan int, 100)
        ch2 := make(chan int, 100)
        
        go loop(ch2)//把ch2的调度提到前面
        go loop(ch1)
        
        for{
            select{
                case j, ok := <- ch2:
                    if false == ok {
                        goto End
                    }
                    fmt.Println("ch2", j)
                    
                case i,ok := <- ch1:
                    if false == ok {
                        goto End
                    }
                    fmt.Println("ch1", i)
                    
                case <-time.After(5 * time.Second):
                    fmt.Println("time's up")
                    goto End
            }
        }
        
        End:
        fmt.Println("finish!")
        
    }

    输出:

    ch2 0
    ch2 1
    ch2 2
    ch2 3
    ch2 4
    ch2 5
    ch2 6
    ch2 7
    ch2 8
    ch2 9
    finish!


    package main
    
    import (
        "fmt"
        "time"
        "runtime"
    )
    
    func loop(ch chan int){
        for i := 0; i < 10; i++ {
             runtime.Gosched()//给别的goroutine让渡出一些调度时间
            ch <- i
        }
        close(ch)
    }
    
    func main() {
        ch1 := make(chan int, 100)
        ch2 := make(chan int, 100)
        
        go loop(ch2)
        go loop(ch1)
        
        for{
            select{
                case j, ok := <- ch2:
                    if false == ok {
                        goto End
                    }
                    fmt.Println("ch2", j)
                    
                case i,ok := <- ch1:
                    if false == ok {
                        goto End
                    }
                    fmt.Println("ch1", i)
                    
                case <-time.After(5 * time.Second):
                    fmt.Println("time's up")
                    goto End
            }
        }
        
        End:
        fmt.Println("finish!")
        
    }

    输出:

    ch2 0
    ch1 0
    ch2 1
    ch1 1
    ch2 2
    ch1 2
    ch2 3
    ch1 3
    ch2 4
    ch1 4
    ch2 5
    ch1 5
    ch2 6
    ch1 6
    ch2 7
    ch1 7
    ch2 8
    ch1 8
    ch2 9
    finish!
  • 相关阅读:
    腾讯2面
    腾讯1面
    快手2面
    快手1面
    formData+ajax文件上传
    nginx限流&健康检查
    jvm crash分析
    Spring Cloud Gateway整合Eureka
    k8s-应用部署
    dockerfile-maven plugin自动镜像制作并发布
  • 原文地址:https://www.cnblogs.com/elaron/p/7118348.html
Copyright © 2020-2023  润新知