channel是golang里很重要的一种数据结构
channel的特性
channel内部实现
buffered channel
在底层使用一个struct
来实现,使用一个环形缓冲区circular queue
来保存元素。
向channel发送值
channel的buffer已满
从channel接收值
ps:
使用make来创建channel时,go在堆上分配一个hchan struct
,然后初始化它,最后返回的是一个指向hchan struct
的指针。
channel发送和接收值的过程
buffered channel
之所以能够goruntine安全,因为每次send
和receive
时,都会对结构体内的mutex
上锁。
下面是send
的过程。
下面是receive
的过程。
channel如何暂停(Pause)和恢复(Resume) goroutine
先了解下Go的调度器和GMP
goroutine可以看做是用户态线程
,goroutine由go运行时创建和管理,被调度器调度到系统线程。
暂停(Pause)goroutine
可以看到,当channel满时,被阻塞的只是goroutine,系统线程仍处在运行状态。
恢复(Resume)goroutine
当从一个满的channel接收值时
参考资料
GopherCon 2017: Kavya Joshi - Understanding Channels
Kavya Joshi - Understanding Channels.pdf
学习了|´・ω・)ノ
群主nb,upup|´・ω・)ノ
冲冲冲