(18条消息) Go语言自学系列 | golang并发编程之runtime包_COCOgsta的博客-CSDN博客_golang runtime包



Go语言自学系列 | golang并发编程之runtime包

COCOgsta 已于 2022-04-09 21:00:12 修改 380 收藏
分类专栏: 视频学习笔记 文章标签: golang go

视频来源:B站《golang入门到项目实战 [2021最新Go语言教程,没有废话,纯干货!持续更新中...]》

一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:Go语言自学系列 | 汇总_COCOgsta的博客-CSDN博客


runtime包里面定义了一些协程管理相关的api

runtime.Gosched()

让出CPU时间片,重新等待安排任务

  1. 1
    package main
  2. 2
  3. 3
    import (
  4. 4
    "fmt"
  5. 5
    "runtime"
  6. 6
    )
  7. 7
  8. 8
    func show(s string) {
  9. 9
    for i := 0; i < 2; i++ {
  10. 10
    fmt.Println(s)
  11. 11
    }
  12. 12
    }
  13. 13
  14. 14
    func main() {
  15. 15
    go show("java")
  16. 16
    // 主协程
  17. 17
    for i := 0; i < 2; i++ {
  18. 18
    // 切一下,再次分配任务
  19. 19
    runtime.Gosched() // 注释掉查看结果
  20. 20
    fmt.Println("golang")
  21. 21
    }
  22. 22
    }
  23. 23

运行结果

  1. 1
    [Running] go run "d:\SynologyDrive\软件开发\go\golang入门到项目实战\goproject\360duote.com\pro01\test.go"
  2. 2
    java
  3. 3
    java
  4. 4
    golang
  5. 5
    golang

runtime.Goexit()

退出当前协程

  1. 1
    package main
  2. 2
  3. 3
    import (
  4. 4
    "fmt"
  5. 5
    "runtime"
  6. 6
    "time"
  7. 7
    )
  8. 8
  9. 9
    func show(s string) {
  10. 10
    for i := 0; i < 10; i++ {
  11. 11
    if i >= 5 {
  12. 12
    runtime.Goexit()
  13. 13
    }
  14. 14
    fmt.Printf("i: %v\n", i)
  15. 15
    }
  16. 16
    }
  17. 17
  18. 18
    func main() {
  19. 19
    go show("java")
  20. 20
    time.Sleep(time.Second)
  21. 21
    }
  22. 22

运行结果

  1. 1
    [Running] go run "d:\SynologyDrive\软件开发\go\golang入门到项目实战\goproject\360duote.com\pro01\test.go"
  2. 2
    i: 0
  3. 3
    i: 1
  4. 4
    i: 2
  5. 5
    i: 3
  6. 6
    i: 4

runtime.GOMAXPROCS

  1. 1
    package main
  2. 2
  3. 3
    import (
  4. 4
    "fmt"
  5. 5
    "runtime"
  6. 6
    "time"
  7. 7
    )
  8. 8
  9. 9
    func a() {
  10. 10
    for i := 0; i < 10; i++ {
  11. 11
    fmt.Println("A:", i)
  12. 12
    time.Sleep(time.Millisecond * 100)
  13. 13
    }
  14. 14
    }
  15. 15
  16. 16
    func b() {
  17. 17
    for i := 0; i < 10; i++ {
  18. 18
    fmt.Println("B:", i)
  19. 19
    }
  20. 20
    }
  21. 21
  22. 22
    func main() {
  23. 23
    fmt.Printf("runtime.NumCPU(): %v\n", runtime.NumCPU())
  24. 24
    runtime.GOMAXPROCS(2) // 修改为1查看效果
  25. 25
    go a()
  26. 26
    go b()
  27. 27
    time.Sleep(time.Second)
  28. 28
    }
  29. 29

运行结果

  1. 1
    [Running] go run "d:\SynologyDrive\软件开发\go\golang入门到项目实战\goproject\360duote.com\pro01\test.go"
  2. 2
    runtime.NumCPU(): 8
  3. 3
    B: 0
  4. 4
    B: 1
  5. 5
    B: 2
  6. 6
    A: 0
  7. 7
    B: 3
  8. 8
    B: 4
  9. 9
    B: 5
  10. 10
    B: 6
  11. 11
    B: 7
  12. 12
    B: 8
  13. 13
    B: 9
  14. 14
    A: 1
  15. 15
    A: 2
  16. 16
    A: 3
  17. 17
    A: 4
  18. 18
    A: 5
  19. 19
    A: 6
  20. 20
    A: 7
  21. 21
    A: 8
  22. 22
    A: 9

如果修改最大核心数为1,运行结果如下,不会出现交替执行现象

  1. 1
    [Running] go run "d:\SynologyDrive\软件开发\go\golang入门到项目实战\goproject\360duote.com\pro01\test.go"
  2. 2
    runtime.NumCPU(): 8
  3. 3
    B: 0
  4. 4
    B: 1
  5. 5
    B: 2
  6. 6
    B: 3
  7. 7
    B: 4
  8. 8
    B: 5
  9. 9
    B: 6
  10. 10
    B: 7
  11. 11
    B: 8
  12. 12
    B: 9
  13. 13
    A: 0
  14. 14
    A: 1
  15. 15
    A: 2
  16. 16
    A: 3
  17. 17
    A: 4
  18. 18
    A: 5
  19. 19
    A: 6
  20. 20
    A: 7
  21. 21
    A: 8
  22. 22
    A: 9


yg9538 2022年7月22日 22:48 286 收藏文档