Go Goroutine
Table of Contents
协程
golang 支持并发和并行, 可以同时跑多个协程
golang 使用 go <function name>()
创建并执行协程
协程本质是一个函数
import (
. "fmt"
"time"
"sync"
)
var wg sync.WaitGroup // 定义 wg 辅助协程计数和执行
func main() {
Println(time.Now()) // 执行前打印时间
wg.Add(2) // 标记需要执行两个协程
go func() { // 新建协程, 类似于将函数放后台执行, main 直接接执行下一个函数
cook()
wg.Done() // 标记协程执行完毕
}
go func() {
wash()
wg.Done()
}
wg.Wait() // 等待所有的协程执行完成
Println(time.Now()) // 所有协程执行完后打印时间
}
func cook() {
time.Sleep(time.Second * 3) // sleep 3s
Println("cook by machine use 3s")
}
func wash() {
time.Sleep(time.Second * 2)
Println("wash close by machine use 2s")
}
> 2023-04-01 21:51:20.692681383 +0800 CST m=+0.000016384
> wash close by machine use 2s
> cook by machine use 3s
> 2023-04-01 21:51:23.693482859 +0800 CST m=+3.000817861
golang 通过新建 2 个协程同时跑 main cook wash 函数, 3 个函数并行执行共花费 3s. main 也是一个协程, main 中若不设置 wg.Wait() 等待其余协程完成, main 执行完成后会关闭所有协程
channel
为了确保协程同步, 或协程之间的数据传递, 通道是队列(先进先出)
无缓冲通道
通道容量为 0, 不能存值, 发送语句和结束语句需要都执行, 否则一方会一直等待另一方导致阻塞
发送语句先执行, 则发送语句阻塞, 等待接收语完后继续执行