从并发编程的视角了解 Go 高性能的本质 | 青训营笔记

64 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天

01. 语言进阶

并发编程的视角了解 Go 高性能的本质

  • Go 可以充分发挥多核优势,高效运行

1.1 Goroutine

image.png

  • 线程用户态轻量级线程,栈 MB 级别
  • 协程内核态线程跑多个协程,栈 KB 级别

实例:快速打印hello goroutine:0 - hello goroutine:4

image.png

💌 如何开启一个协程呢?我们只需要在调用的函数前面添加 go 关键字,就能使这个函数以协程的方式运行。

1.2 CSP (Communicating Sequential Processes)

image.png

提倡通过通信共享内存,而不是通过共享内存而实现通信

1.3 Channel

  • 使用 make 初始化 Channel,并且可以设置容量

    make(chan 元素类型, [缓存大小])

  • 容量(capacity) 代表 Channel 容纳的最多的元素的数量,代表 Channel 的缓存的大小

    • 无缓冲通道(同步通道) make(chan int)
    • 有缓冲通道(典型的生产 —— 消费模型make(chan int, 2)
  • 如果没有设置容量,或者容量设置为 0, 说明 Channel 没有缓存,只有 sender 和 receiver 都准备好了后它们的通讯(communication)才会发生(Blocking)。

  • 如果设置了缓存,就有可能不发生阻塞, 只有 buffer 满了后 send 才会阻塞, 而只有缓存空了后 receive 才会阻塞。一个 nil channel 不会通信。

image.png

实例 —— 生产消费模型

image.png

1.4 并发安全 Lock

image.png

1.5 WaitGrop

image.png

  • 计数器

    开启协程 +1;执行结束 -1;主协程阻塞直到计数器为 0

实例:快速打印hello goroutine:0 - hello goroutine:4

image.png

小结:

  1. Goroutine:协程,通过高效的调度模型实现高并发操作

  2. Channel:通过通信实现共享内存

  3. Sync:实现并发安全操作和协程间的同步

总结

有人把Go语言比作 21 世纪的C语言,第一是因为Go语言设计简单,第二则是因为 21 世纪最重要的就是并发程序设计,而 Go 从语言层面就支持并发。同时实现了自动垃圾回收机制。

Go语言的并发机制运用起来非常简便,在启动并发的方式上直接添加了语言级的关键字就可以实现,和其他编程语言相比更加轻量。

引用参考

  1. 学习资料
  2. 学习视频
  3. 锁Lock
  4. 线程同步 WaitGroup
  5. Go Module