【笔记】Go语言的协程

前言

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

引入包

1
import runtime

查看当前操作系统的逻辑CPU个数

1
num := runtime.NumCPU()

设置可同时执行的最大CPU个数

  • Go1.8之后的版本默认已经使用了多核CPU

<num>:使用的CPU的个数

1
runtime.GOMAXPROCS(<num>)

完成

参考文献

哔哩哔哩——尚硅谷
哔哩哔哩——筱筱知晓
哔哩哔哩——go圈里最会写js的奇淼