并发编程
并发&并行
- 并发是指一个处理器同时处理多个任务。
- 并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。
- 并发是逻辑上的同时发生,而并行是物理上的同时发生。
Goroutine
Goroutine 是轻量级线程,Goroutine 的调度是由 Golang 运行时进行管理的。
Goroutine 和线程的区别
- 内存消耗更少
- 创建与销毁的开销更小
- 切换开销更小
Channel
Go语言中的Channel是一种用于协程之间通信的机制。在并发编程中,协程之间的通信是非常重要的,因为它可以使得不同的协程之间协同工作,从而实现更高效的程序执行。
特性
- 线程安全
- 阻塞式发送和接收
- 可以保证顺序性
- 可以设置缓冲区大小
- 可以关闭
并发控制
互斥锁 sync.Mutex
sync.Mutex是一个互斥锁,可以由不同的Goroutine加锁和解锁。
sync.Mutex是Golang标准库提供的一个互斥锁,当一个Goroutine获得互斥锁权限后,其他请求锁的Goroutine会阻塞在Lock()方法的调用上,直到调用Unlock()方法被释放。
WaitGroup
在 sync.WaitGroup(等待组)类型中,每个 sync.WaitGroup 值在内部维护着一个计数,此计数的初始默认值为零。
对于一个可寻址的 sync.WaitGroup 值 wg:
- 使用方法 wg.Add(delta) 来改变值 wg 维护的计数。
- 方法 wg.Done() 和 wg.Add(-1) 是完全等价的。
- 如果一个 wg.Add(delta) 或者 wg.Done() 的调用将 wg 维护的计数更改成一个负数,一个panic将产生。
- 当一个协程调用了 wg.Wait() 时,
- 如果此时 wg 维护的计数为零,则此 wg.Wait() 此操作为一个空操作(noop);
- 否则(计数为一个正整数),此协程将进入阻塞状态。当以后其它某个协程将此计数更改至 0 时(一般通过调用 wg.Done()),此协程将重新进入运行状态(即 wg.Wait() 将返回)。