channel
2021-01-19 01:15:51 0 举报
go语言channel相关
作者其他创作
大纲/内容
使用场景
Y
channel用来在多个goroutine之间传递数据
发送队列有G说明buf满
有缓冲channel:缓冲区满,发送阻塞,缓冲区空,接收阻塞;用于处理异步
被唤醒(唤醒时数据已被取走,被写入到buf)
发送操作和接收操作什么时候会长时间阻塞
N
将数据写入第一个G
结束发送
开始接收
唤醒G
sendq非空?
无缓冲channel:一开始都被阻塞,用于同步处理
从recvq中取出第一个G
对已经关闭的channel进行操作会引发panic
有缓冲区?
从buf中recvx位置读取元素(队首)
从sendq中取出一个G
阻塞当前G,将当前G加入sendq,等待被唤醒
qcount>0
将当前G加入recvq中,等待被唤醒
从管道中读数据
被唤醒,唤醒时数据已写入buf
buf有空位?
select,nil的无缓冲channel会阻塞,而不是报panic
向管道中写数据
将数据写入
发送方,将副本拷入channel
从sendq取出一个G
recvq非空?
接收方接受channel中值副本,并删除channel中的值
结束接收
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
把该G中的数据写入buf中sendx位置(队尾)
从buf中读取recvx位置元素
从G中读取数据
开始发送
收藏
收藏
0 条评论
回复 删除
下一页