zoukankan      html  css  js  c++  java
  • 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!
  • 相关阅读:
    Flink流处理(一)- 状态流处理简介
    YARN High Availablity
    把数组转换成sql中能使用的字符串
    StringUtils中 isNotEmpty 和isNotBlank的区别
    SQL的四种连接-左外连接、右外连接、内连接、全连接
    JS判断输入是否为整数的正则表达式
    Java构造和解析Json数据的两种方法详解二
    JSON详解
    Java构造和解析Json数据的两种方法详解一
    详细讲解JAVA中的IO流
  • 原文地址:https://www.cnblogs.com/elaron/p/7118348.html
Copyright © 2011-2022 走看看