-
- GMP 调度模型 1.1 GMP 概述 Go 语言中的 GMP 模型是 Goroutine 的调度机制,通过三个核心概念实现并发任务的高效调度: G(Goroutine):轻量级线程,每个 G 代表一个独立的任务。 M(Machine):代表操作系统的线程,负责执行 G。 P(Processor):逻辑处理器,管理 G 的队列,绑定 M 来调度 G。 1.2 调度模型的原理 工作窃取(Work Stealing):当一个 P 没有要执行的 Goroutine 时,它会从其他 P 中窃取任务执行,以保持负载平衡。 Hand-off(任务交接):Hand Off 是 Go 调度系统中的优化机制。当一个 M(Machine)由于执行 …
Read More -
Go语言中的map是一种哈希表(hash table)数据结构,支持键值对的高效存取。通过键(key)计算哈希值并将其映射到对应的存储桶(bucket)中,map可以在平均O(1)的时间复杂度下进行插入、查找和删除操作。Go的map底层实现非常精巧,结合了哈希表的基本思想,同时针对冲突和内存管理做了很多优化。
- Go map 的基本结构 在Go中,map通过哈希表实现,其底层结构主要由以下几个部分组成: 1.1 Bucket(存储桶) 1Bucket 2+--------------------+---------------------+---------------------+ 3| keys (k1, k2, ...) …
Read More -
是的,Go的channel是线程安全的。 Go中的channel是一种用于不同goroutine之间通信的原语,它可以在多个goroutine之间安全地传递数据,而不需要显式地使用锁机制(如mutex)来同步访问。Go语言的设计确保了channel在并发场景下是安全的,这使得它非常适合在多goroutine环境中用于数据传递和同步。 Go Channel 的底层实现 Go语言的channel底层实现非常精巧,通过Go runtime(运行时)和调度器(scheduler)来保证其线程安全性。其主要的实现机制依赖于goroutine调度、队列和锁来保证数据的安全传递。下面我们详细解析channel的底层实现:
- Channel 的 …
Read More -
- 栈与堆内存分配 在Go语言中,栈和堆是两种主要的内存分配区域。理解它们的区别和作用,是理解内存逃逸的关键。 栈(Stack): 作用:栈是一种连续的内存区域,主要用于存储函数调用中的局部变量。栈的特点是后进先出(LIFO),当函数执行时,局部变量在栈上分配,函数执行结束后,栈上的内存会自动回收。 特点:栈上的内存分配非常快,分配和释放都是由系统自动完成的,空间占用小,适合短生命周期的局部变量。 局限:栈的大小是有限的,当变量的生命周期超出栈帧,或变量的大小超过栈的限制时,栈上的变量就会转移到堆上,这就是内存逃逸。 堆(Heap): 作用:堆是一个动态内存区域,大小不受限制。Go的**垃圾回收器(GC)**负责自动管理堆内存,分 …
Read More -
For people new to Golang and Python, this article explains what closures are as well as sometips that need to know about when using closures in these two programming languages. To make it easier for you to copy down and run on your own server, the code section would provide the package, import, and other repeated …
Read More -
近期配置了uber家的zap日志库,觉得性能比较强,展示比较美观,在这里做一个分享,代码在第三部分可以自取。 为什么不选择原生log? 说起golang如何优雅的打印日志,任何一个golang的初学者大概都是用的原生log库,或者直接fmt.Println()...但是这种方式并不优雅,并且有以下缺点: 对于基础日志:不能细粒度区分info和debug级别的日志; 对于错误日志: 不支持除了fatal或者panic的普通error级别告知。 log示例 1package main 2 3import "log" 4 5func main() { 6 log.Print("info or debug") …
Read More -
在使用client-go的watch接口时候碰到异常退出问题,查了一下google没有多少信息,于是扒了一下代码,把自己踩的坑记录下来方便以后自查自纠。 使用client-go watch接口 💡 全局的mycluster都等于*kubernetes.Clientset 1. 如何watch 由于kubernetes整合了etcd的watch功能,我们可以通过watch操作去建立一个长连接,不断的接收数据;这种方式要优于普通的反复轮询请求,降低server端的压力; 使用client-go调用对应对象的Watch()方法之后,会返回一个watch.Event对象,可以对其使用ResultChan()接受watch到的对象。 …
Read More