author:魏静崎
2024年9月11日
Golang并发
sync.WaitGroup
应用
等待一组协程完成,通过计数器来获取协程的完成情况,计数器清零后才能继续操作
陷阱
协程之间传递WaitGroup对象需要传递指针或闭包方式,因为默认是值传递,否则会发生死锁
要避免IO输出(或是读写相同的变量),因为IO是串行的,就没有意义了;要避免锁,因为会有调度问题浪费时间。
sync.Cond
作用
设置一组协程根据条件阻塞,可以根据不同的条件阻塞
可以根据条件唤醒相应的协程
应用:协程一发多收,其他协程需要等待一个协程完成一个动作
注意
被唤醒方(一个或多个)必须加锁
唤醒方可以有锁
尽可能减少无效的唤醒
Mute与RWMutex
作用
并发场景下,通过锁机制,解决数据竞争问题
应用场景
协程安全、数据竞争
注意事项
1、尽量避免使用锁
2、合理使用锁机制
sync.Map
一个线程安全集合,内部通过原子访问和锁机制实现结合的线程安全
应用场景
1、适合读多写少的应用场景
2、在key值已存在的情况下,可以无锁修改其value,比普通map+锁性能更好
sync.Pool
作用
创建一个临时对象池,缓存一组对象重复利用,减少内存分配和降低GC的压力
应用场景
可用于连接池(grpc客户端、网络连接等)
注意事项
1、用于缓存一些创建成本较高,使用比较频繁的对象
2、Pool的长度默认为CPU的线程数
3、存储在Pool中的对象随时都可能在不被通知的情况下被回收
4、没有什么创建成本的对象不建议使用对象池
sync.Once
用于初始化单例资源
使用场景
1、单例场景
2、仅加载一次的数据懒加载场景
sync/atomic
atomic包提供底层的原子级内存操作,用于实现同步算法
atomic.CompareAndSwapInt64(&count, 30, 40)
比较原有的值是否是30,如果是则替换为40返回true,如果不是则不替换并返回false。
应用场景
通过内存通道实现通信
注意事项
1、atomic属于底层原子操作,如务必要请使用通道或者sync包的其他函数实现同步函数
2、如果没有把握正确使用atomic则请不要使用
Context
1、译为上下文
2、用于进程之间信息和信号传递
3、用于服务之间的信息和信号传递
应用场景
1、用于父协程和子协程间取消信号传递
2、用于客户端和服务器之间的信息传递
3、用于设置请求超时时间
- 本文作者: 魏静崎
- 本文链接: https://slightwjq.github.io/2024/09/11/Go并发/
- 版权声明: 该文章来源及最终解释权归作者所有