前言
Go语言的协程goroutine学习笔记
并发和并行
- 并发:多线程程序在单核CPU上运行
- 并行:多线程程序在多核CPU上运行
Go的协程和Go的主线程
- 一个Go程序(进程)会启动一个主线程,主线程可以启动多个协程(Routine)
- 主线程是物理线程,直接作用于CPU上,是重量级的,非常消耗资源
- 协程是由主线程启动的,是逻辑太的,是轻量级的,对资源消耗相对较小
协程的特点
- 有独立的栈空间
- 共享程序堆空间
- 协程的调度由程序控制
- 协程类似轻量级的线程
开启一个协程
- 通过
go
关键字开启一个协程,通过协程执行函数
- 协程会与主线程并行执行
- 如果主线程执行完毕,即便是协程还未执行完,也会强制退出
1 2 3 4 5 6 7 8 9 10
| func fun() { ... }
func main() {
go fun() ... }
|
等待协程结束
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| package main
import "sync"
func run(waitGroup *sync.WaitGroup) { waitGroup.Done() }
func main() { var waitGroup sync.WaitGroup waitGroup.Add(1) go run(&waitGroup)
...
waitGroup.Wait() }
|
Runtime
引入包
查看当前操作系统的逻辑CPU个数
设置可同时执行的最大CPU个数
<num>
:使用的CPU的个数
1
| runtime.GOMAXPROCS(<num>)
|
完成
参考文献
哔哩哔哩——尚硅谷 哔哩哔哩——筱筱知晓 哔哩哔哩——go圈里最会写js的奇淼