Goroutine channel机制 - Go语言中文社区

Goroutine channel机制


channel结构是Goroutine间消息传递的基础,属于基本类型。 Goroutine基于Communicating Sequential Processes并发模型理论。

由count、sendx和recvx一同构成了一个环形buffer的状态域

1、任务 Go#1 向channel发送数据#1,此时channel的缓冲区是空的,并且没有正在阻塞的任务,则数据#1被拷贝到缓冲区,缓冲区指针后移,Go#1 完成操作退出(非阻塞)
在这里插入图片描述

2、当channel的缓冲区被填满后,当另一个任务 Go#4 再进行发送操作时,就只能将自己及待发送的数据#4以某种方式链入channel的发送等待队列中,并挂起(阻塞)
在这里插入图片描述

3、这时,任务 Go#5 发起针对这个channel的Recv操作,首先将从缓冲区读取并拷贝数据,直到缓冲区为空
在这里插入图片描述

4、此时缓冲区已空,又有一个任务 Go#8 发起一个Recv操作,它将从发送队列取出一个阻塞的数据,即之前Go#4假设发送的#4数据,然后读取并拷贝该数据,并将Go#4唤醒
在这里插入图片描述

channel的操作主要包括以下几种:
创建:ch = make(chan int, N)
发送:ch <- l
接收:l <- ch
关闭:close(ch)
默认buffer为0 ,当buffer大于0时,可以进行异步的消息传递

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/cjxunooo/article/details/84994502
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-28 00:44:16
  • 阅读 ( 1617 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢