这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
01. 语言进阶
从并发编程的视角了解 Go 高性能的本质
- Go 可以充分发挥多核优势,高效运行
1.1 Goroutine
- 线程:用户态,轻量级线程,栈 MB 级别
- 协程:内核态,线程跑多个协程,栈 KB 级别
实例:快速打印hello goroutine:0 - hello goroutine:4
💌 如何开启一个协程呢?我们只需要在调用的函数前面添加 go 关键字,就能使这个函数以协程的方式运行。
1.2 CSP (Communicating Sequential Processes)
提倡通过通信共享内存,而不是通过共享内存而实现通信
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 不会通信。
实例 —— 生产消费模型
1.4 并发安全 Lock
1.5 WaitGrop
-
计数器
开启协程 +1;执行结束 -1;主协程阻塞直到计数器为 0
实例:快速打印hello goroutine:0 - hello goroutine:4
小结:
Goroutine:协程,通过高效的调度模型实现高并发操作
Channel:通过通信实现共享内存
Sync:实现并发安全操作和协程间的同步
总结
有人把Go语言比作 21 世纪的C语言,第一是因为Go语言设计简单,第二则是因为 21 世纪最重要的就是并发程序设计,而 Go 从语言层面就支持并发。同时实现了自动垃圾回收机制。
Go语言的并发机制运用起来非常简便,在启动并发的方式上直接添加了语言级的关键字就可以实现,和其他编程语言相比更加轻量。