/images/hugo/avatar.png

go CyclicBarrier 循环栅栏

1. CyclicBarrier 概述

CyclicBarrier 是一个可重用的栅栏并发原语,常常应用于重复进行一组 goroutine 同时执行的场景中。

CyclicBarrier允许一组 goroutine 彼此等待,到达一个共同的执行点。同时,因为它可以被重复使用,所以叫循环栅栏。具体的机制是,大家都在栅栏前等待,等全部都到齐了,就抬起栅栏放行。

go SingleFlight 请求合并

1. SingleFlight 栅栏概述

SingleFlight 的作用是将并发请求合并成一个请求,以减少对下层服务的压力。当多个 goroutine 同时调用同一个函数的时候,只让一个 goroutine 去调用这个函数,等到这个 goroutine 返回结果的时候,再把结果返回给这几个同时调用的 goroutine,这样可以减少并发调用的数量。

go 信号量

1. 信号量概述

信号量(Semaphore)是用来控制多个 goroutine 同时访问多个资源的并发原语。最简单的信号量就是一个变量加一些并发控制的能力,更复杂的信号量类型,就是使用抽象数据类型代替变量,用来代表复杂的资源类型。实际上,大部分的信号量都使用一个整型变量来表示一组资源,并没有实现太复杂的抽象数据类型。

go 内存模型

1. Go 内存模型概述

Go 内存模型 描述的是并发环境中多 goroutine 读相同变量的时候,变量的可见性条件。具体点说,就是指,在什么条件下,goroutine 在读取一个变量的值的时候,能够看到其它 goroutine 对这个变量进行的写的结果

Channel 应用

1. 使用反射操作 Channel

在学习如何使用 Channel 之前,我们来看看如何通过反射的方式执行 select 语句,这在处理很多的 case clause,尤其是不定长的 case clause 的时候,非常有用。

Channel 使用与实现

1. Channel 概述

1.1 CSP 模型

要想了解 Channel,我们要先追溯到 CSP 模型。CSP 是 Communicating Sequential Process 的简称,中文直译为通信顺序进程,或者叫做交换信息的循序进程,是用来描述并发系统中进行交互的一种模式。CSP 允许使用进程组件来描述系统,它们独立运行,并且只通过消息传递的方式通信。有关Go 中如何通过 Channel 实现 CSP 参见这边文章CSP 的发展