面向云技术架构 - 痴者工良

  • 首页
  • 工良写的电子书
    • kubernetes 教程
    • 从 C# 入门 Kafka
    • 多线程和异步
    • 动态编程-反射、特性、AOP
    • 表达式树
  • 本站文章导航
  • 隐私政策
愿有人陪你颠沛流离
遇到能让你付出的事物或者人,都是一种运气。
能遇到,就该珍惜。或许你们最终没能在一起,但你会切实地感受到力量。
正因为这样,那段相遇才变得有价值,才没有辜负这世间的每一段相遇。
  1. 首页
  2. 编程语言
  3. Golang
  4. 正文

Golang channel 基于 select 的多路复用

2022年11月13日 278点热度 0人点赞 0条评论
内容纲要

在下面这个示例中,定时器每 1 秒向 channel 发生一次消息。当数量达到 10 次时,会自动终止。

func main() {
    fmt.Println("Commencing countdown.")
    tick := time.Tick(1 * time.Second)
    for countdown := 10; countdown > 0; countdown-- {
        v := <-tick
        fmt.Println(countdown, v)
    }
}

file

但是,如果需要中途取消,则需要使用 select。
其格式如下:

select {
case <-ch1:
    // ...
case x := <-ch2:
    // ...use x...
case ch3 <- y:
    // ...
default:
    // ...
}

如果 select 中使用了 defalut,则要求在进入 select 中时,就需要有其中一个 case 准备好,否则一进入 select,就会执行 default 的代码。

select 只会被执行一次。

如果 select 中没有 default,并且在 进入 select 时,所有通道都没有内容,那么 select 就会阻塞。

经过改进,取消执行的代码示例如下:

package main

import (
    "bufio"
    "fmt"
    "os"
    "time"
)

func main() {
    stop := make(chan int)
    go tick(stop)
    scanner := bufio.NewScanner(os.Stdin)
    scanner.Scan()
    stop <- 0
    fmt.Println("已结束")
}

func tick(stop chan int) {

    fmt.Println("Commencing countdown.")
    tick := time.Tick(1 * time.Second)

    for countdown := 10; countdown > 0; countdown-- {
        select {
        case v := <-tick:
            {
                fmt.Println(countdown, v)
                break
            }
        case <-stop:
            return
        }
    }
}
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: channel golang select 基于 多路复用
最后更新:2022年11月13日

痴者工良

高级程序员劝退师

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2022 whuanle.cn. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备18051778号

粤公网安备 44030902003257号