注:本文已发布超过一年,请注意您所使用工具的相关版本是否适用
本系列为 Go 进阶训练营 笔记,访问 博客: Go进阶训练营, 即可查看当前更新进度,部分文章篇幅较长,使用 PC 大屏浏览体验更佳。
最开始打算一周更新 1 - 2 篇学习笔记,这样既可以跟上课程的进度又能输出一些文章,分享一点知识,但是在写到 week03 Go 并发编程这个系列的时候发现,掉进坑里面了,毛老师虽然只讲了两节课,大概 7 小时左右,但是实际上每一个点如果要深入理解学习透还是要花费大量时间的。这也就导致了这一周的课程加上本文一共输出了十一篇文章,超过了 4W 字,但是这还没结束,还有几个常用的数据数据结构没有讲到,例如 sync.Map sync.Pool 等,这些会再接下来不定期的去更新。
写完这一篇文章之后能够发现之前写的代码很多不太合理的地方,看了一圈源码之后现在也可以说在 Go 并发编程上面算是入门了。接下来我们就一起回顾一下我们之前所讲的内容。我把文章目录放在了最后,可分别点击查看。
第一篇文章主要讲解了 Goroutine 使用的相关注意事项,或者也可以说是最佳实践
第二篇文章主要是根据 Go 官方文档中的内存模型进行阐述,后面也提到了一些 CPU 内存重排的相关知识, 主要目的是让大家知道为什么我们要使用同步原语来进行显示的同步控制
e1 发生在 e2 之前,那么我们就说 e2 发生在 e1 之后,如果 e1 既不在 e2 前,也不在 e2 之后,那我们就说这俩是并发的go 语句会在当前 goroutine 开始执行前启动新的 goroutine在了解了并发编程的时候为什么需要显示的同步后,这一篇文章讲述了我们如何去发现存在并发问题,也就是数据竞争的情况
-race flag 就可以开启 data race 的检测在了解了为什么要用同步原语,以及知道如何发现并发问题之后,我们就开始依次讲解相关的同步原语,第一篇就是 mutex
互斥锁其实就是大量使用了 atomic 来实现的,所以紧接着我们就来看了 atomic 包的相关实现
AddXXX 等LOCK 指令,然后通过查阅 Intel 手册我们知道了在前面的案例中不止一次出现了 waitgroup 的身影,这篇文章深入分析了 waitgroup 的实现
WaitGroup 可以用于一个 goroutine 等待多个 goroutine 干活完成,也可以多个 goroutine 等待一个 goroutine 干活完成,是一个多对多的关系Add(n>0) 方法应该在启动 goroutine 之前调用,然后在 goroution 内部调用 Done 方法WaitGroup 必须在 Wait 方法返回之后才能再次使用Done 只是 Add 的简单封装,所以实际上是可以通过一次加一个比较大的值减少调用,或者达到快速唤醒的目的。WaitGroup 中关于 32 位和 64 位机器的处理非常巧妙,值得学习WaitGroup 学习完了我们紧接着就学习了 errgroup,因为相对于 WaitGroup errgroup 在某些场景下更加实用
这篇文章主要讲解了 sync.once 的使用和实现
这篇文章讲解的比较细致,从源码分析,到使用准则和场景以及存在的缺点都讲到了
context 包一开始就告诉了我们应该怎么用,不应该怎么用,这是应该被共同遵守的约定。
WithCancel , WithDeadline , WithTimeout 创建的 Context 会同时返回一个 cancel 方法,这个方法必须要被执行,不然会导致 context 泄漏,这个可以通过执行 go vet 命令进行检查context.Context 作为函数的第一个参数进行传递,参数命名一般为 ctx 不应该将 Context 作为字段放在结构体中。context.TODO()这篇文章从资料收集,到源码阅读再到最终成文花了快半个月的时间,不过写完之后就我个人而言是收获满满的,不知到能不能为屏幕前的你带来一点点启发,如果可以那就太赞了。这篇文章从最开始的理论 csp/actor 到 hanpens before 再到 channel 的基本用法,源码实现,最后讲到了一些使用场景,但是由于长度精力还是个人水平等多种限制有的地方讲解还是不够细致,具体强烈建议阅读一些参考文献里面的十几篇文章,每一个都值得细细品味。
我将本系列的所有文章地址都放在这里,感兴趣可以点击链接查看文章详情
注:本文已发布超过一年,请注意您所使用工具的相关版本是否适用
本系列为 Go 进阶训练营 笔记,访问 博客: Go进阶训练营, 即可查看当前更新进度,部分文章篇幅较长,使用 PC 大屏浏览体验更佳。
最开始打算一周更新 1 - 2 篇学习笔记,这样既可以跟上课程的进度又能输出一些文章,分享一点知识,但是在写到 week03 Go 并发编程这个系列的时候发现,掉进坑里面了,毛老师虽然只讲了两节课,大概 7 小时左右,但是实际上每一个点如果要深入理解学习透还是要花费大量时间的。这也就导致了这一周的课程加上本文一共输出了十一篇文章,超过了 4W 字,但是这还没结束,还有几个常用的数据数据结构没有讲到,例如 sync.Map sync.Pool 等,这些会再接下来不定期的去更新。
写完这一篇文章之后能够发现之前写的代码很多不太合理的地方,看了一圈源码之后现在也可以说在 Go 并发编程上面算是入门了。接下来我们就一起回顾一下我们之前所讲的内容。我把文章目录放在了最后,可分别点击查看。
第一篇文章主要讲解了 Goroutine 使用的相关注意事项,或者也可以说是最佳实践
第二篇文章主要是根据 Go 官方文档中的内存模型进行阐述,后面也提到了一些 CPU 内存重排的相关知识, 主要目的是让大家知道为什么我们要使用同步原语来进行显示的同步控制
e1 发生在 e2 之前,那么我们就说 e2 发生在 e1 之后,如果 e1 既不在 e2 前,也不在 e2 之后,那我们就说这俩是并发的go 语句会在当前 goroutine 开始执行前启动新的 goroutine在了解了并发编程的时候为什么需要显示的同步后,这一篇文章讲述了我们如何去发现存在并发问题,也就是数据竞争的情况
-race flag 就可以开启 data race 的检测在了解了为什么要用同步原语,以及知道如何发现并发问题之后,我们就开始依次讲解相关的同步原语,第一篇就是 mutex
互斥锁其实就是大量使用了 atomic 来实现的,所以紧接着我们就来看了 atomic 包的相关实现
AddXXX 等LOCK 指令,然后通过查阅 Intel 手册我们知道了在前面的案例中不止一次出现了 waitgroup 的身影,这篇文章深入分析了 waitgroup 的实现
WaitGroup 可以用于一个 goroutine 等待多个 goroutine 干活完成,也可以多个 goroutine 等待一个 goroutine 干活完成,是一个多对多的关系Add(n>0) 方法应该在启动 goroutine 之前调用,然后在 goroution 内部调用 Done 方法WaitGroup 必须在 Wait 方法返回之后才能再次使用Done 只是 Add 的简单封装,所以实际上是可以通过一次加一个比较大的值减少调用,或者达到快速唤醒的目的。WaitGroup 中关于 32 位和 64 位机器的处理非常巧妙,值得学习WaitGroup 学习完了我们紧接着就学习了 errgroup,因为相对于 WaitGroup errgroup 在某些场景下更加实用
这篇文章主要讲解了 sync.once 的使用和实现
这篇文章讲解的比较细致,从源码分析,到使用准则和场景以及存在的缺点都讲到了
context 包一开始就告诉了我们应该怎么用,不应该怎么用,这是应该被共同遵守的约定。
WithCancel , WithDeadline , WithTimeout 创建的 Context 会同时返回一个 cancel 方法,这个方法必须要被执行,不然会导致 context 泄漏,这个可以通过执行 go vet 命令进行检查context.Context 作为函数的第一个参数进行传递,参数命名一般为 ctx 不应该将 Context 作为字段放在结构体中。context.TODO()这篇文章从资料收集,到源码阅读再到最终成文花了快半个月的时间,不过写完之后就我个人而言是收获满满的,不知到能不能为屏幕前的你带来一点点启发,如果可以那就太赞了。这篇文章从最开始的理论 csp/actor 到 hanpens before 再到 channel 的基本用法,源码实现,最后讲到了一些使用场景,但是由于长度精力还是个人水平等多种限制有的地方讲解还是不够细致,具体强烈建议阅读一些参考文献里面的十几篇文章,每一个都值得细细品味。
我将本系列的所有文章地址都放在这里,感兴趣可以点击链接查看文章详情