Golang并发模型:轻松入门select

栏目: Go · 发布时间: 7年前

内容简介:之前的文章都提到过,在Golang里,select就是干这个事的:到吃饭了去吃饭,该睡觉了就睡觉,没事干就打豆豆。结束发散,我们看下select的功能,以及它能做啥。

之前的文章都提到过, Golang的并发模型都来自生活,select也不例外 。举个例子:我们都知道一句话,“吃饭睡觉打豆豆”,这一句话里包含了3件事:

  1. 妈妈喊你吃饭,你去吃饭。
  2. 时间到了,要睡觉。
  3. 没事做,打豆豆。

在Golang里,select就是干这个事的:到吃饭了去吃饭,该睡觉了就睡觉,没事干就打豆豆。

结束发散,我们看下select的功能,以及它能做啥。

select功能

在多个通道上进行读或写操作,让函数可以处理多个事情,但1次只处理1个。以下特性也都必须熟记于心:

case

select长下面这个样子,由 selectcase 组成, default 不是必须的,如果没其他事可做,可以省略 default

func main() {
    readCh := make(chan int, 1)
    writeCh := make(chan int, 1)

    y := 1
    select {
    case x := <-readCh:
        fmt.Printf("Read %d\n", x)
    case writeCh <- y:
        fmt.Printf("Write %d\n", y)
    default:
        fmt.Println("Do what you want")
    }
}

我们创建了 readChwriteCh 2个通道:

  1. readCh 中没有数据,所以 case x := <-readCh 读不到数据,所以这个case不能执行。
  2. writeCh 是带缓冲区的通道,它里面是空的,可以写入1个数据,所以 case writeCh <- y 可以执行。
  3. case 可以执行,所以 default 不会执行。

这个测试的结果是

$ go run example.go
Write 1

用打豆豆实践select

来,我们看看select怎么实现打豆豆: eat() 函数会启动1个协程,该协程先睡几秒,事件不定,然后喊你吃饭, main() 函数中的 sleep 是个定时器,每3秒喊你吃1次饭, select 则处理3种情况:

eatCh
sleep.C
default
import (
    "fmt"
    "time"
    "math/rand"
)

func eat() chan string {
    out := make(chan string)
    go func (){
        rand.Seed(time.Now().UnixNano())
        time.Sleep(time.Duration(rand.Intn(5)) * time.Second)
        out <- "Mom call you eating"
        close(out)
    }()
    return out
}


func main() {
    eatCh := eat()
    sleep := time.NewTimer(time.Second * 3)
    select {
    case s := <-eatCh:
        fmt.Println(s)
    case <- sleep.C:
        fmt.Println("Time to sleep")
    default:
        fmt.Println("Beat DouDou")
    }
}

由于前2个case都要等待一会,所以都不能执行,所以执行 default ,运行结果一直是打豆豆:

$ go run x.go
Beat DouDou

现在我们不打豆豆了,你把 default 和下面的打印注释掉,多运行几次,有时候会吃饭,有时候会睡觉,比如这样:

$ go run x.go
Mom call you eating
$ go run x.go
Time to sleep
$ go run x.go
Time to sleep

select很简单但功能很强大,它让golang的并发功能变的更强大。这篇文章写的啰嗦了点,重点是为下一篇文章做铺垫,下一篇我们将介绍下select的高级用法。

select的应用场景很多,让我总结一下,放在下一篇文章中吧。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Practical Django Projects, Second Edition

Practical Django Projects, Second Edition

James Bennett / Apress / 2009 / 44.99

Build a django content management system, blog, and social networking site with James Bennett as he introduces version 1.1 of the popular Django framework. You’ll work through the development of ea......一起来看看 《Practical Django Projects, Second Edition》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

URL 编码/解码
URL 编码/解码

URL 编码/解码