Go语言并发 | 青训营

65 阅读2分钟

并发编程

并发&并行

  • 并发是指一个处理器同时处理多个任务。
  • 并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。
  • 并发是逻辑上的同时发生,而并行是物理上的同时发生。

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() 将返回)。