去年和董大大聊过两句 Go 的定时器,当时大概看了眼代码是四叉堆,不过实现细节忽略掉了。
前几天和刘丁还有董大又聊起定时器的事情,正好就借这个机会把 Go 的定时器实现完整梳理一遍。不涉及 netpoll,因为我还没有看完这部分代码。
董大的文章网络和定时器怎么结合都提到了,感兴趣的可以看 这里 [https://www.jianshu.com/p/427dfe8ad3c0]。
看到两边有一样的图不要奇怪,所以这篇文章可以算联动吗,哈哈。
定时器算是服务端程序是非常重要的功能,特别是和网络或者文件系统打交道的系统,我们都会对每一次 IO
操作都加上合理的超时,以避免各种特定情况下的资源泄露。所以了解定时器的实现还是挺重要的。
PS: 看来
《concurrency in go》这本书出版于 2017
年八月,里面有些观点还是蛮新颖的,烂大街的我就先不写了,重点写写书里提到的,我之前忽视的观点,以及一些奇技淫巧。
锁的粒度太大的话,有可能造成其它的 goroutine 饥饿
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
var sharedLock sync.Mutex
const runtime
推荐用 stackedit 导出后看,文章中有不少 mermaid 图表,ghost 博客不支持展示。原始的 markdown 保存在:这里
[https://github.com/cch123/golang-notes/blob/master/scheduler.md]
写得稍微有点乱,主要是按自己看代码的顺序来记录的,也不是出书,就这样吧。
PS: 新人不推荐刚学 Golang 就去看调度器代码,这部分代码个人觉得写得很乱。
调度
基本数据结构
goroutine
18 年已经到 6
月份了,定目标可能有点太晚了,不过有总比没有强,作为一个硕士毕业已经工作四年的程序员,切实地感觉到了时间的重要性,需要按照规划来用,不能像年轻人那样挥霍了。
1. 完成 Golang 的大部分源代码阅读,并完成 golang-notes
[http://github.com/cch123/golang-notes]
2. 完成 redis 3.0 的源代码阅读并有总结产出
3. 完成 nginx 的源代码阅读并有总结产出,这个坑遗留得有点久,14
最近在看的 《concurrency in go》 里有这么一个例子:
package main
import (
"fmt"
"sync"
"sync/atomic"
"time"
)
func main() {
cadence := sync.NewCond(&sync.Mutex{})
go func() {
for range time.Tick(1 * time.Millisecond) {
cadence.Broadcast()
}
}()
takeStep := func(