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包解决同步问题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 也可以解决同步问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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  // 等待接收通道中的数据
}

  

 

posted @   专职  阅读(642)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示