曹大带我学 Go(2)—— 迷惑的 goroutine 执行顺序

上一篇文章我们讲了 Go 调度的本质是一个生产-消费流程。 生产端是正在运行的 goroutine 执行 go func(){}() 语句生产出 goroutine 并塞到三级队列中去。 消费端则是 Go 进程中的 m 在不断地执行调度循环,从三级队列中拿到 goroutine 来运行。 今天我们来通过 2 个实际的代码例子来看看 goroutine 的执行顺序是怎样的。 第一个例子 首先来看第一个例子: 1package main 2 3import……

阅读全文

曹大带我学 Go(1)—— Go 调度的本质

首先抛出本文的结论:Go 调度的本质是一个生产-消费流程。 生产者-消费者模型 我们平时用 Go 最爽的一点莫过于用一句 go func(){}() 就启动了一个 goroutine 来并发地执行任务。这比用 C/C++ 启动一个线程并发地去执行任务方便太多。这句代码实际上就生产出了一个 goroutine,并进入可运行队列,等待 m 来找它从而可以得到……

阅读全文

深度解密 Go 语言之基于信号的抢占式调度

不知道大家在实际工作中有没有遇到过老版本 Go 调度器的坑:死循环导致程序“死机”。我去年就遇到过,并且搞出了一起 P0 事故,还写了篇弱智的找 bug 文章。 识别事故的本质,并且用一个非常简单的示例展示出来,是功力的一种体现。那次事故的原因可以简化成如下的 demo: 我来简单解释一下上面这个程序。在……

阅读全文

深度阅读之《Mastering Go》

写在前面:这本书前前后后花了挺长时间,去年 11 月份就开始读了,中间又断了,直到最近才捡起来看完。 本书讲得内容非常全面,语言也很顺畅,生词非常少,并且内容没有太大难度,看起来比较过瘾,算是全面复习一下 Go 语言。如果你想开始练习阅读英文书,这本将是一个非常好的开始。 下面是阅读过程中记录的……

阅读全文

喜提 Go Contributor

上次写了一篇《喜提 Redir Contributor》,内容是给欧神写的一个短网址小工具加了一个输出结果排序的功能,凑了个热闹。结果有朋友看成了 redis contributor,并没有那么牛逼~😛 但这次真的是给 golang/go 提交了代码,喜提 Go Contributor。 当然因为是第一次,只是改了几个 typos,不……

阅读全文

Go 命令 『go build -X』 的妙用

不知道大家还记不记得,上次发了一篇关于 panic 检测机器人的文章,原理非常简单,简单回顾一下: 业务服务在 recover 函数里通过 HTTP 请求的方式向机器人上报 panic 栈信息。 机器人解析出 panic 栈里的代码行号,调用 gitlab 接口拿到该行代码的提交人、提交日期等信息。 当然,后面我又给机器人增加了一些其他的功能,例如自动拉群,自……

阅读全文

Go channel 的妙用

昨天在内网上看到一篇讲数据库连接的文章,列出了一些 sql 包的一些源码,我注意到其中取用、归还连接的方式非常有意思——通过临时创建的 channel 来传递连接。 在 sql.DB 结构体里,使用 freeConn 字段来表示当前所有的连接,也就是一个连接池。 1type DB struct { 2 freeConn []*driverConn 3} 当需要拿连接的时候,从 freeConn 中取出第一个元素: 1conn := db.freeConn[0] 2copy(db.freeConn, db.freeConn[1:]) 3db.freeConn = db.freeConn[:numFree-1] 4conn.inUse……

阅读全文

事故现场之依赖了不该依赖的 host ip

昨天,组里服务遇到了一个诡异的问题,跟着看了下原因,记录在此。 先介绍背景:我们维护了两个服务,一个对外服务,承接流量,称之为主服务,主服务会调用各种第三方 RPC 服务,获取各种字段,拼在一个大的 model 上。其中有一个 RPC 服务,称之为 E 服务,是我们自己维护的,它返回一部分字段。 E 服务会定时读取规……

阅读全文

写一个 panic blame 机器人

最近接手了一个“公共”服务,负责维护它的稳定性。代码库有很多人参与“维护”,其实就是各种业务方使劲往上堆逻辑。虽然入库前我会进行 CR,但多了之后,也看不过来,还有一些人自己偷摸就把代码合到 master 上去了。总之,代码质量无法得到很好的保证。 当然了,如果把合代码的权限收敛到我一个人,理论上……

阅读全文

喜提 redir contributor

看多了 Go 源代码,看一看应用,尤其是比较短小且有趣的应用代码,感觉很有意思,而且举重若轻。 如果顺带修一下小的错误,成为 Contributor,那就更多了一种成就感。就像杨文前几天成为 Go Contributor 那样,从小处开始,慢慢提升技术含量,总有一天,慢慢成为真正的 Contributor,像曹大那样。……

阅读全文