|
|
51CTO旗下网站
|
|
移动端

10.3.2 select

《Go语言编程入门与实战技巧》第10章并发编程,本章Go语言里的并发指的是能让某个函数独立于其他函数运行的能力。当一个函数创建为协程(goroutine)时,Go语言会将其视为一个独立的工作单元,这个单元会被调度到可用的逻辑处理器上执行。本节为大家介绍select。

作者:黄靖钧来源:电子工业出版社|2018-09-23 09:49

10.3.2  select

早在UNIX时代,select机制就已经被引入。通过调用select()函数来监控一系列的文件句柄,一旦其中一个文件句柄发生了I/O动作,该select()调用就会被返回。后来该机制也被用于实现高并发的Socket服务器程序。Go语言直接在语言级别支持select关键字,用于处理异步I/O问题。

select的用法与switch语言非常类似,由select开始一个新的选择块,每个选择条件由case语句来描述。与switch语句可以选择任何可使用相等比较的条件相比,select有比较多的限制,其中最大的一条限制就是每个case语句里必须是一个I/O操作,大致的结构如下:

  1. select {  
  2.     case <-chan1: // 如果chan1成功读到数据,则进行该case处理语句  
  3.     case chan2 <- 1: // 如果成功向chan2写入数据,则进行该case处理语句  
  4.     default: // 如果上面都没有成功,则进入default处理流程  
  5. }  

可以看出,select不像switch,后面并不带判断条件,而是直接去查看case语句。每个case语句都必须是一个面向channel的操作。比如上面的例子中,第一个case试图从chan1读取一个数据并直接忽略读到的数据,而第二个case则是试图向chan2中写入一个整数1,如果这两者都没有成功,则到达default语句。

基于此功能,可以实现一个有趣的程序:

  1. ch :make(chan int, 1)  
  2. for {  
  3.     select {  
  4.         case ch <- 0:  
  5.         case ch <- 1:  
  6.     }  
  7.     i :<-ch 
  8.     fmt.Println("接收到的值为:", i)  
  9. }  

这个程序实现了一个随机向ch写入一个0或者1的过程。当然,这是个死循环。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书会第9群:808517103

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

2006软考上半年试题分析与解答

本书是针对全国计算机技术与软件专业技术资格(水平)考试而编写的,书中详尽分析与解答了2006年上半年的程序员级、软件设计师级、软件评测...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊