golang
文章平均质量分 85
dandyhuang
这个作者很懒,什么都没留下…
展开
-
grpc-go彻底弄清http2协议如何解析
大家如果理解了tcp协议的大致流程,那么h2协议就不难理解从最开始学习http2的协议,了解client端是先发送HEAD帧,在发送DATA帧数据。一开始可能一直陷入为什么DATA的数据没有接受完,就可以处理业务逻辑。并且回调启协程没有太注意看。recvMsg中read的嵌套非常深。种种原因,叠加在一起,一开始确实一头雾水。不过拨开云雾,逐层慢慢分析,思路还是比较清晰的。client©先和server(S)建立h2握手(settting帧),回复ack。后C继续发送HEAD帧。原创 2023-01-30 12:07:03 · 424 阅读 · 0 评论 -
内存模型-Memory Model
Cache line是Cache和RAM交换数据的最小单位,通常为64 Byte。当 CPU 把内存的数据载入Cache时,会把临近的共64 Byte的数据一同放入同一个Cache line,因为空间局部性:临近的数据在将来被访问的可能性大。由于CPU Cache缓存数据最小的单位是一个Cache Line(64节),如果两个Core读取了同一个Cache Line,并对Cache Line中的数据频繁读写,就会有的问题。原创 2023-01-17 20:23:47 · 1811 阅读 · 0 评论 -
golang im实战入门
学了这篇文章,搞定im不成问题原创 2022-10-27 10:12:01 · 1691 阅读 · 0 评论 -
go runtime 基础学习-go:linkname
之前在看mutex、channel等源码的时候,发现很多都会调用,,等。当你跳转过去后,会发现没有实际的实现。类似c++中的.h文件。其实,可以理解为runtime.go包里头,为其声明。实现则为在阅读golang源码的时候,也可以看到很多go:linkname指令,理解这个指令有助于我们更好的理解golang代码的底层逻辑。原创 2022-12-08 15:22:23 · 360 阅读 · 0 评论 -
golang ants协程池源码分析
整理思路还是很清晰的,submit从队列中获取goworker,并启动goroutine,等待任务插入。这里过期的时候,将w放到了sync.pool中,避免每次过期,都需要重新创建Pool。其余就是比较正常的,goroutine检测task任务,队列的存储等。原创 2022-11-09 10:24:42 · 443 阅读 · 0 评论 -
golang sync.pool源码分析无锁队列实现
Put只能从对头插入,并且每个p只能插入自己的队列,所以可以理解为线程安全的。Get获取先从private -> shared -> 循环其他P -> victim cache -> NewpoolLocal和GMP中的P大小一致,GMP中的思想,尽可能的提高性能。多个地方使用无锁思想。这里特别强调为什么每个p来说,是单个生产者,多个消费者模式。并且只能队头插入,如果对尾也可以插入,这种做法是无法做到无锁操作的。原创 2022-11-09 10:22:32 · 748 阅读 · 0 评论 -
redigo连接池源码解析
如果没有连接池管理,如每次请求,协程都创建一个连接,那么当请求量巨大时,产生非常大的浪费并且可能会导致高负载下的异常发生,最终导致所有服务都不可用。当Pool.get获取的连接,并没有保存在连接池中,而是当activeConn.Close()时,才调用put,保存连接。因为上面的条件如果都校验成功,说明链表头部有数据,我们只需pop出来,之后返回activeConn,即我们成功后去了一个连接。当pool中设置了Wait,当连接满时(p.ch获取不到数据),会等待直到池中有空闲连接,就会通知ch。原创 2022-11-09 10:21:37 · 389 阅读 · 0 评论 -
golang rate令牌桶源码分析实现
golang令牌桶实现原创 2022-09-13 14:18:28 · 446 阅读 · 0 评论