Go 系列文章5 : 定时器

去年和董大大聊过两句 Go 的定时器,当时大概看了眼代码是四叉堆,不过实现细节忽略掉了。 前几天和刘丁还有董大又聊起定时器的事情,正好就借这个机会把 Go 的定时器实现完整梳理一遍。不涉及 netpoll,因为我还没有看完这部分代码。 董大的文章网络和定时器怎么结合都提到了,感兴趣的可以看 这里 [https://www.jianshu.com/p/427dfe8ad3c0]。 看到两边有一样的图不要奇怪,所以这篇文章可以算联动吗,哈哈。 定时器算是服务端程序是非常重要的功能,特别是和网络或者文件系统打交道的系统,我们都会对每一次 IO 操作都加上合理的超时,以避免各种特定情况下的资源泄露。所以了解定时器的实现还是挺重要的。 PS: 看来

concurrency in go 读书笔记

《concurrency in go》这本书出版于 2017 年八月,里面有些观点还是蛮新颖的,烂大街的我就先不写了,重点写写书里提到的,我之前忽视的观点,以及一些奇技淫巧。 锁的粒度太大的话,有可能造成其它的 goroutine 饥饿 package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup var sharedLock sync.Mutex const runtime

Go 系列文章4 : 调度器

推荐用 stackedit 导出后看,文章中有不少 mermaid 图表,ghost 博客不支持展示。原始的 markdown 保存在:这里 [https://github.com/cch123/golang-notes/blob/master/scheduler.md] 写得稍微有点乱,主要是按自己看代码的顺序来记录的,也不是出书,就这样吧。 PS: 新人不推荐刚学 Golang 就去看调度器代码,这部分代码个人觉得写得很乱。 调度 基本数据结构 goroutine

2018 年的几个目标

18 年已经到 6 月份了,定目标可能有点太晚了,不过有总比没有强,作为一个硕士毕业已经工作四年的程序员,切实地感觉到了时间的重要性,需要按照规划来用,不能像年轻人那样挥霍了。 1. 完成 Golang 的大部分源代码阅读,并完成 golang-notes [http://github.com/cch123/golang-notes] 2. 完成 redis 3.0 的源代码阅读并有总结产出 3. 完成 nginx 的源代码阅读并有总结产出,这个坑遗留得有点久,14

livelock

最近在看的 《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(