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

10.3 通道(channel)

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

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

10.3  通道(channel)

channel是Go语言在语言级别提供的goroutine间的通信方式,可以使用channel在两个或多个goroutine之间传递消息。channel是进程内的通信方式,因此通过channel传递对象的过程和调用函数时的参数传递行为比较一致,比如也可以传递指针等。如果需要跨进程通信,建议用分布式系统的方法来解决,比如使用Socket或者HTTP等通信协议。Go语言对于网络方面也有非常完善的支持。

channel是类型相关的,也就是说,一个channel只能传递一种类型的值,这个类型需要在声明channel时指定。如果对UNIX管道有所了解的话,就不难理解channel,可以将其认为是一种类型安全的管道。

在了解channel的语法前,先看一下用channel的方式重写上面的例子是什么样子的,以此对channel先有一个直观的认识,如下面代码所示:

  1. // 示例代码10-4  
  2. package main  
  3.  
  4. import "fmt"  
  5.  
  6. func Count(ch chan int) {  
  7.     ch <- 1  
  8.     fmt.Println("Counting")  
  9. }  
  10. func main() {  
  11.     chs :make([]chan int, 10)  
  12.     for i :0; i < 10; i++ {  
  13.         chs[i] = make(chan int)  
  14.         go Count(chs[i])  
  15.     }  
  16.     for _, ch :range chs {  
  17.         <-ch 
  18.     }  
  19. }  

在这个例子中,定义了一个包含10个channel的数组(名为chs),并把数组中的每个channel分配给10个不同的goroutine。在每个goroutine的Add()函数完成后,通过ch <- 1语句向对应的channel中写入一个数据。在这个channel被读取前,这个操作是阻塞的。在所有的goroutine启动完成后,通过<-ch语句从10个channel中依次读取数据。在对应的channel写入数据前,这个操作也是阻塞的。这样,就用channel实现了类似锁的功能,进而保证了所有goroutine完成后主函数才返回。

在使用Go语言开发时,经常会遇到需要实现条件等待的场景,这也是channel可以发挥作用的地方。对channel的熟练使用,才能真正理解和掌握Go语言并发编程。下面学习channel的基本语法。


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

51CTO读书频道二维码


51CTO读书会第9群:808517103

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

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

读 书 +更多

公钥基础设施PKI及其应用

公钥基础设施PKI(Public Key Infrastructure)是利用公钥概念和加密技术为网上通信提供的符合标准的一整套安全基础平台。公钥基础设施能为...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊