Golang使用轻量级线程(goroutine)和channel实现自己的并发模型。
它的线程模型实现如下:
一、 Goroutine
Goroutine是一个轻量级的线程。
- 通过go关键字开启,例如:
go func() {
// ...
}()
- 调度由Golang运行时完成,非常高效
- 与OS线程隔离,消除线程上下文切换开销
二、 Goroutine 调度
Goroutine的调度采用M:N模型:
- M个逻辑Goroutine映射到N个系统线程
- 当一个Goroutine阻塞时,会切换到别的Goroutine上执行
- 线程之间共享可访问的内存
- 调度完全由Golang运行时完成
三、Channel
Channel提供Goroutine之间的通信方式:
- 多个Goroutine可以通过Channel传递数据
- Channel支持并发编程的同步和通信
- Channel是有类型和容量限制的Queue
- 通过close关闭Channel
四、关系
- 一个Goroutine对应一个线程上下文
- 多个Goroutine在多个系统线程上切换执行
- 通过Channel实现Goroutine间的通信
总的来说,Golang的线程模型主要通过:
- Goroutine – 轻量级线程
- Goroutine高效调度
- Channel 提供 Goroutine 间通信
- M:N线程模型
这提供了高性能的并发处理能力。同时高内聚的Goroutine和低耦合的Channel结构,有利于模块化开发。