golang中的goroutine
1. 概念
go中可以并发执行的活动单元称为goroutine
当一个go程序启动时,一个执行main function的goroutine会被创建,称为main goroutine
go func() 使用go语句开启一个新的goroutine之后,go语句之后的函数调用将在新的goroutine中执行, 并且不会阻塞当前程序的运行
goroutine是实际并发的实体,两个实体之间通过channel来实现数据的共享
goroutine底层是使用coroutine实现并发,
golang使用goroutine做为最小的执行单位,这个执行单位还是在用户空间,实际最后被处理器执行的还是内核中的线程
goroutine本质上是协程,不受内核调度,由go的调度器来调度
2. goroutine是异步执行,就有可能导致主程序执行完退出时还有goroutine还没有执行完,此时goroutine也会跟着退出
此时如果想等到所有goroutine任务执行完毕才退出,go提供了
sync
包解决同步问题
package main import ( "fmt" "sync" "time" ) func add(n1, n2 int, g *sync.WaitGroup) { time.Sleep(time.Second) fmt.Println(n1 + n2) defer g.Done() // goroutine完成后,WaitGroup的计数-1 } func main() { var goSync sync.WaitGroup goSync.Add(1) // WaitGroup的计数+1 go add(11, 22, &goSync) goSync.Wait() // 等待所有goroutine执行完毕 fmt.Println("结束了") }
channel 也可以解决同步问题
package main import "time" func worker(c chan bool) { time.Sleep(time.Second * 2) c <- true } func main() { done := make(chan bool) go worker(done) <-done // 等待接收通道中的数据 }