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

10.2.2 协程间通信

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

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

10.2.2  协程间通信

从上面的例子可以看到,关键字go的引入使得在Go语言中并发编程变得简单而便捷,但同时也应该意识到并发编程的原生复杂性,并时刻对并发中容易出现的问题保持警惕。别忘了,我们的例子还不能正常工作呢。

事实上,不管是什么平台,什么编程语言,不管在哪里,并发都是一个大话题,话题大小通常也直接对应于问题的大小。并发编程的难度在于协调,而协调就要通过交流,从这个角度看来,并发单元间的通信是最大的问题。

通常有两种最常见的并发通信模型:共享数据和消息。

共享数据是指多个并发单元分别保持对同一个数据的引用,实现对该数据的共享。被共享的数据可能有多种形式,比如内存数据块、磁盘文件、网络数据等。在实际工程应用中最常见的无疑是内存了,也就是常说的共享内存。

将代码修改为如下形式:

  1. // 示例代码10-3  
  2. package main  
  3.  
  4. import (  
  5.     "fmt"  
  6.     "runtime"  
  7.     "sync"  
  8. )  
  9.  
  10. var counter int = 0 
  11.  
  12. func Count(lock *sync.Mutex) {  
  13.     lock.Lock()  
  14.     counter++  
  15.     fmt.Println(z)  
  16.     lock.Unlock()  
  17. }  
  18. func main() {  
  19.     lock := &sync.Mutex{}  
  20.     for i :0; i < 10; i++ {  
  21.         go Count(lock)  
  22.     }  
  23.     for {  
  24.         lock.Lock()  
  25.         c :counter 
  26.         lock.Unlock()  
  27.         runtime.Gosched()  
  28.         if c >= 10 {  
  29.             break  
  30.         }  
  31.     }  
  32. }  

此时这个例子终于可以正常工作了。在上面的例子中,在10个goroutine中共享了变量counter。每个goroutine执行完成后,将counter的值加1。因为10个goroutine是并发执行的,所以还引入了锁,也就是代码中的lock变量。每次对n的操作,都要先将锁锁住,操作完成后,再将锁打开。在主函数中,使用for循环来不断检查counter的值(同样需要加锁)。当其值达到10时,说明所有goroutine都执行完毕了,这时主函数返回,程序退出。

但是实现一个如此简单的功能,却写出如此臃肿而且难以理解的代码。想象一下,在一个大的系统中具有无数的锁、无数的共享变量、无数的业务逻辑与错误处理分支,那将是一场噩梦(目前主流语言基本都有这个问题)。Go语言既然以并发编程作为语言的核心优势,当然不至于将这样的问题用这么无奈的方式来解决。Go语言提供的是另一种通信模型,即以消息机制而非共享内存作为通信方式。

消息机制认为每个并发单元是自包含的、独立的个体,并且都有自己的变量,但在不同并发单元间这些变量不共享。每个并发单元的输入和输出只有一种,那就是消息。这有点类似于进程的概念,每个进程不会被其他进程打扰,它只做好自己的工作就可以了。不同进程间靠消息来通信,它们不会共享内存。

Go语言提供的消息通信机制被称为通道(channel),接下来将详细介绍channel。

最后再强调一遍,不要通过共享内存来通信,而应该通过通信来共享内存。


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

51CTO读书频道二维码


51CTO读书会第9群:808517103

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

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

读 书 +更多

UNIX到Linux的移植

本书讲述怎样把UNIX环境下的应用程序移植到Linux环境上运行,是一本综合的开发和解决问题的参考手册 。本书详细描述了当前IT行业中被广泛应...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊