浏览文章

Golang

5 项

Go语言 goroutine调度

G、P、M 是 Go 调度器的三个核心组件,各司其职。在它们精密地配合下,Go 调度器得以高效运转,这也是 Go 天然支持高并发的内在动力。今天这篇文章我们来深入理解 GPM 模型。 先看 G,取 goroutine 的首字母,主要保存 goroutine 的一些状态信息以及 CPU 的一些寄存器的值,例如 IP 寄存 …

继续阅读

Go语言 goroutine VS thread

goroutine,绕不开的一个话题是:它和 thread 有什么区别? 参考资料【How Goroutines Work】告诉我们可以从三个角度区别:内存消耗、创建与销毀、切换。 内存占用 创建一个 goroutine 的栈内存消耗为 2 KB,实际运行过程中,如果栈空间不够用,会自动进行扩容。创建一个 thread …

继续阅读

Go语言 - 从 channel 接收数据

源码分析 我们先来看一下接收相关的源码。在清楚了接收的具体过程之后,再根据一个实际的例子来具体研究。 接收操作有两种写法,一种带 “ok”,反应 channel 是否关闭;一种不带 “ok”,这种写法,当接收到相应类型的零值时无法知道是真实的发送者发送过来的值,还是 channel 被关闭后,返回给接收者的默认类型的零 …

继续阅读

Go语言 - 向 channel 发送数据

源码分析 发送操作最终转化为 chansend 函数,直接上源码,同样大部分都注释了,可以看懂主流程: // 位于 src/runtime/chan.go func chansend(c *hchan, ep unsafe.Pointer, block bool, callerpc uintptr) bool { // …

继续阅读

Go语言 channel底层结构

数据结构 底层数据结构需要看源码,版本为 go 1.9.2: type hchan struct { // chan 里元素数量 qcount uint // chan 底层循环数组的长度 dataqsiz uint // 指向底层循环数组的指针 // 只针对有缓冲的 channel buf …

继续阅读