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!

 

posted @   elar  阅读(346)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示