ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Go语言编程从入门到精通(通道、缓冲通道、阻塞、控制、select)

2022-01-14 12:33:59  阅读:164  来源: 互联网

标签:listen 函数 Goroutine 消息 Go 执行 select 通道


Go (或Golang )是Google 在2007 年开发的一种开源编程语言,出自Robert Griesemer 、Rob Pike 和Ken Thompson 之手。2009 年11 月10 日, Google Open Source Blog 向全球发布了这款语言:公告指出Go 的主要目标是“兼具Python 等动态语句的开发速度和C 或C ++等编译型语言的性能与安全性”。

通道

在上一篇中学到了Gotoutine,解决处理并行操作的问题,下面学习通道,通过通道来管理Goroutine之间的通信。

1. 使用通道

2个人持有1个联名卡,卡的余额100元,他们同时从账户中取100元钱,如果交易过程不加锁,那么虽然显示余额都有100元,实际上却是不够。如果在第1个交易时候,给账户加锁,交易完成后解锁,那么就可以避免这样的问题。

Go语言编程从入门到精通(通道、缓冲通道、阻塞、控制、select)

8行:在函数中,参数是通道变量

12行:执行结束后,函数向通道发送一条消息“listen finish”

15行:定义一个存储字符串的通道,赋给变量c

16行:用Goroutine执行函数listen

17行:等待通道传过来的消息,将消息赋给变量msg

18行:输出消息内容

2. 使用缓冲通道

一般情况下,通道在受到消息后发送给接受者,但是,有的时候并没有接受者,面对这种情况,可以使用缓冲通道,将数据存储在通道中,等待接受者准备好了再发送。

Go语言编程从入门到精通(通道、缓冲通道、阻塞、控制、select)

执行结果

Go语言编程从入门到精通(通道、缓冲通道、阻塞、控制、select)

执行流畅:

22行:创建1个长度为2缓冲通道

24行:用Goroutine执行函数listen

25行:用Goroutine执行函数walk

8行、14行:同时执行listen和walk函数,执行结束后,向通道发送消息

26行至29行:循环输出通道内的消息

30行:打印运行结束

23行:关闭通道

3. 阻塞和流程控制

给通道指定消息接受者,这是一个阻塞行为,这是由于阻止了函数的返回,一直等到受到一条消息。

首先可以考虑下下面代码执行结果是什么?

Go语言编程从入门到精通(通道、缓冲通道、阻塞、控制、select)

考虑5秒钟

5

4

3

2

1

执行结果

Go语言编程从入门到精通(通道、缓冲通道、阻塞、控制、select)

为什么没有一直循环呢?

这是因为当受到一条消息后,阻塞的操作就返回了,函数也就中断了,而循环关系并不大,和运行环境和执行流程有关。

那么有什么办法可以让循环一直进行呢?

Go语言编程从入门到精通(通道、缓冲通道、阻塞、控制、select)

执行结果如下:

Go语言编程从入门到精通(通道、缓冲通道、阻塞、控制、select)

在接收指定数量的消息后就退出,就可以采用for语句进行迭代执行。

4. 使用select语句

如果有多个Goroutine,默认情况下,谁先返回,Gotoutine首先执行响应操作,此时如使用select,可以根据返回的结果选择执行响应操作。

Go语言编程从入门到精通(通道、缓冲通道、阻塞、控制、select)

Go语言编程从入门到精通(通道、缓冲通道、阻塞、控制、select)

18行、19行:床架了2个存储字符串的通道。

22行、23行:启用2个Goroutine,执行相对应的函数。

此时等待通道接收信息

由于walk函数等待了2秒,先返回。

24行到29行:判断消息是来源于哪个通道,如果是c1,则执行26行,如果是c2,则执行28行

执行完毕,执行结束,不再阻塞进程,程序退出。

标签:listen,函数,Goroutine,消息,Go,执行,select,通道
来源: https://blog.csdn.net/phpygo/article/details/122491471

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有