1 信号量
golang.org/x/sync :使用互斥锁 +List 实现的。互斥锁实现其它字段的保护,而 List 实现了一个等待队列,等待者的通知是通过 Channel 的通知机制实现的。
https://github.com/marusama/semaphore :可以动态更改资源容量的信号量
2 单飞模式
https://pkg.go.dev/golang.org/x/sync/singleflight 合并读请求
3 信号栅栏
https://github.com/marusama/cyclicbarrier 一组 goroutine 彼此等待,到达一个共同的执行点。同时,因为它可以被重复使用,所以叫循环栅栏。
4 分组操作
https://github.com/golang/sync/tree/master/errgroup 将一个通用的父任务拆成几个小任务并发执行
https://github.com/neilotoole/errgroup 增加了可以控制并发 goroutine 的功能
https://github.com/go-pkgz/syncs 可以控制并发的 goroutine 数量
https://github.com/vardius/gollback 用来处理一组子任务的执行的,不过它解决了 ErrGroup 收集子任务返回结果的痛点
https://github.com/AaronJan/Hunch 可以用来做任务流和前几个子任务成功或者后几个子任务成功等应用场景
https://github.com/mdlayher/schedgroup 一个和时间相关的处理一组 goroutine 的并发原语 schedgroup
https://github.com/pieterclaerhout/go-waitgroup 创建一个goroutine池来控制并发性。
5 分布式锁
github.com/coreos/etcd/clientv3/concurrency etcd 选主 Leader、分布式锁 Mutex、Locker
github.com/coreos/etcd/contrib/recipes 分布式读写锁RWMutex、分布式队列Queue、分布式优先队列PriorityQueue、分布式栅栏Barrier、分布式计数型栅栏 DoubleBarrier