视频来源:B站《golang入门到项目实战 [2021最新Go语言教程,没有废话,纯干货!持续更新中...]》
一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:Go语言自学系列 | 汇总_COCOgsta的博客-CSDN博客
runtime包里面定义了一些协程管理相关的api
让出CPU时间片,重新等待安排任务
1package main 2 3import ( 4 "fmt" 5 "runtime" 6) 7 8func show(s string) { 9 for i := 0; i < 2; i++ { 10 fmt.Println(s) 11 } 12} 13 14func main() { 15 go show("java") 16 // 主协程 17 for i := 0; i < 2; i++ { 18 // 切一下,再次分配任务 19 runtime.Gosched() // 注释掉查看结果 20 fmt.Println("golang") 21 } 22} 23
运行结果
1[Running] go run "d:\SynologyDrive\软件开发\go\golang入门到项目实战\goproject\360duote.com\pro01\test.go" 2java 3java 4golang 5golang
退出当前协程
1package main 2 3import ( 4 "fmt" 5 "runtime" 6 "time" 7) 8 9func show(s string) { 10 for i := 0; i < 10; i++ { 11 if i >= 5 { 12 runtime.Goexit() 13 } 14 fmt.Printf("i: %v\n", i) 15 } 16} 17 18func main() { 19 go show("java") 20 time.Sleep(time.Second) 21} 22
1[Running] go run "d:\SynologyDrive\软件开发\go\golang入门到项目实战\goproject\360duote.com\pro01\test.go" 2i: 0 3i: 1 4i: 2 5i: 3 6i: 4
1package main 2 3import ( 4 "fmt" 5 "runtime" 6 "time" 7) 8 9func a() { 10 for i := 0; i < 10; i++ { 11 fmt.Println("A:", i) 12 time.Sleep(time.Millisecond * 100) 13 } 14} 15 16func b() { 17 for i := 0; i < 10; i++ { 18 fmt.Println("B:", i) 19 } 20} 21 22func main() { 23 fmt.Printf("runtime.NumCPU(): %v\n", runtime.NumCPU()) 24 runtime.GOMAXPROCS(2) // 修改为1查看效果 25 go a() 26 go b() 27 time.Sleep(time.Second) 28} 29
1[Running] go run "d:\SynologyDrive\软件开发\go\golang入门到项目实战\goproject\360duote.com\pro01\test.go" 2runtime.NumCPU(): 8 3B: 0 4B: 1 5B: 2 6A: 0 7B: 3 8B: 4 9B: 5 10B: 6 11B: 7 12B: 8 13B: 9 14A: 1 15A: 2 16A: 3 17A: 4 18A: 5 19A: 6 20A: 7 21A: 8 22A: 9
如果修改最大核心数为1,运行结果如下,不会出现交替执行现象
1[Running] go run "d:\SynologyDrive\软件开发\go\golang入门到项目实战\goproject\360duote.com\pro01\test.go" 2runtime.NumCPU(): 8 3B: 0 4B: 1 5B: 2 6B: 3 7B: 4 8B: 5 9B: 6 10B: 7 11B: 8 12B: 9 13A: 0 14A: 1 15A: 2 16A: 3 17A: 4 18A: 5 19A: 6 20A: 7 21A: 8 22A: 9
手机扫一扫转发分享