深度思维者

永远年轻,永远热泪盈眶

随笔分类 -  go并发编程

摘要:一.序 这一篇算是并发编程的一个补充,起因是当前有个项目,大概の 需求是,根据kafka的分区(partition)数,创建同等数量的 消费者( goroutine)从不同的分区中消费者消费数据,但是总有某种原因导致,某一个分区消费者创建失败,但是其他分区消费者创建失败。 最初的逻辑是,忽略分区失败 阅读全文
posted @ 2021-12-12 00:02 failymao 阅读(814) 评论(1) 推荐(0) 编辑
摘要:一.设计原理 Go 语言中最常见的、也是经常被人提及的设计模式就是: "不要通过共享内存来通信,我们应该使用通信来共享内存" 通过共享内存来通信是直接读取内存的数据,而通过通信来共享内存,是通过发送消息的方式来进行同步。 而通过发送消息来同步的这种方式常见的就是 Go 采用的通信顺序进程 CSP(C 阅读全文
posted @ 2021-11-23 00:30 failymao 阅读(2313) 评论(0) 推荐(0) 编辑
摘要:一. 序言 1.1 场景一 现在有一个 Server 服务在执行,当请求来的时候我们启动一个 goroutine 去处理,然后在这个 goroutine 当中有对下游服务的 rpc 调用,也会去请求数据库获取一些数据,这时候如果下游依赖的服务比较慢,但是又没挂,只是很慢,可能一次调用要 1min 才 阅读全文
posted @ 2021-11-17 01:03 failymao 阅读(1483) 评论(0) 推荐(1) 编辑
摘要:一. 前言 了解 sync.WaitGroup的用法都知道 一个 goroutine 需要等待多个 goroutine 完成和多个 goroutine 等待一个 goroutine 干活时都可以解决问题 WaitGroup 的确是一个很强大的工具,但是使用它相对来说还是有一点小麻烦, 一方面我们需要 阅读全文
posted @ 2021-11-07 23:46 failymao 阅读(4738) 评论(0) 推荐(0) 编辑
摘要:一.序 单从库名大概就能猜出其作用。sync.Once使用起来很简单, 下面是一个简单的使用案例 package main import ( "fmt" "sync" ) func main() { var ( once sync.Once wg sync.WaitGroup ) for i := 阅读全文
posted @ 2021-11-02 23:28 failymao 阅读(539) 评论(2) 推荐(0) 编辑
摘要:一. 序言 WaitGroup是Golang应用开发过程中经常使用的并发控制技术。 WaitGroup,可理解为Wait-Goroutine-Group,即等待一组goroutine结束。比如某个goroutine需要等待其他几个goroutine全部完成,那么使用WaitGroup可以轻松实现。 阅读全文
posted @ 2021-11-01 23:46 failymao 阅读(767) 评论(0) 推荐(0) 编辑
摘要:1. 前言 在学习 mutex后。 在读源码的时候发现里面使用了很多atomaic 包的方法来保证原子。在并发编程中,常常提到的并发安全,具体数据就是 对数据的修改读取是否是原子操作 所以也常说,并发是否能保证了原子操作。在Golang语言中,实现原子操作是在标准库实现的,即 sync/atomic 阅读全文
posted @ 2021-11-01 09:56 failymao 阅读(827) 评论(0) 推荐(0) 编辑
摘要:一.前言 我们反复提到了goroutine的创建时简单的。 但是仍然要小心, 习惯总是会导致我们可能写出一些bug.对于语言规范没有定义的内容不要做任何的假设。 需要通过同步语义来控制代码的执行顺序 这一点很重要。 这些包提供了一些基础的同步语义,但是在实际的并发编程当中,我们应该使用 channe 阅读全文
posted @ 2021-10-31 22:23 failymao 阅读(494) 评论(0) 推荐(0) 编辑
摘要:1.前言 虽然在 go 中,并发编程十分简单, 只需要使用 go func() 就能启动一个 goroutine 去做一些事情,但是正是由于这种简单我们要十分当心,不然很容易出现一些莫名其妙的 bug 或者是你的服务由于不知名的原因就重启了。 而最常见的bug是关于线程安全方面的问题,比如对同一个m 阅读全文
posted @ 2021-09-26 08:16 failymao 阅读(678) 评论(0) 推荐(0) 编辑
摘要:1. 前言 GMP调度应该是被面试的时候问的频率最高的问题! 我们知道,一切的软件都是跑在操作系统上,真正用来干活 (计算) 的是 CPU。早期的操作系统每个程序就是一个进程,知道一个程序运行完,才能进行下一个进程,就是 “单进程时代” 一切的程序只能串行发生。 1.1 Goroutine 调度器的 阅读全文
posted @ 2021-09-22 08:10 failymao 阅读(860) 评论(0) 推荐(1) 编辑
摘要:1. 对创建的gorouting负责 1.1 不要创建一个你不知道何时退出的 goroutine 下面的代码有什么问题? 是不是在我们的程序种经常写类似的代码? // Week03/blog/01/01.go package main import ( "log" "net/http" _ "net 阅读全文
posted @ 2021-09-14 23:41 failymao 阅读(4735) 评论(4) 推荐(6) 编辑