golang中的goroutine

作者: adm 分类: go 发布时间: 2022-07-15

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  // 等待接收通道中的数据
}

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!