runtime.Gosched()
作用是让出CPU时间片,重新等待安排任务。执行runtime.Gosched()后,其他协程优先执行,当前所在协程最后执行。
golang
package main
import (
"fmt"
"runtime"
)
func main() {
go func(s string) {
for i := 0; i < 10; i++ {
fmt.Println(s)
}
}("world")
// 主协程
for i := 0; i < 2; i++ {
// 切一下,再次分配任务
runtime.Gosched()
fmt.Println("hello")
}
}
runtime.Goexit()
终止协程,不再调用,注意不能在main方法中终止,会触发panic.
go
package main
import (
"fmt"
"runtime"
"time"
)
func printHello() {
defer fmt.Println("end func printHello")
for i := 1; i < 10; i++ {
fmt.Println("start print")
if i%4 == 0 {
runtime.Goexit()
}
fmt.Printf("start print:%d\n", i)
}
}
func main() {
go printHello()
time.Sleep(6 * time.Second)
}
由以上代码可以看出,实际上触发runtime.Goexit()后,协程立即停止运行了。
runtime.GOMAXPROCS
设置最大运行核心数,Go运行时的调度器使用GOMAXPROCS参数来确定需要使用多少个OS线程来同时执行Go代码
其他
runtime包实际上有非常多方法,例如加上panic的trace信息:
golang
package main
import (
"fmt"
"runtime"
"time"
)
func a() {
err := runtime.StartTrace()
if err != nil {
return
}
fmt.Println("start trace__")
defer fmt.Printf("done")
for i := 1; i < 10; i++ {
if i%4 == 0 {
panic("err non")
}
}
runtime.StopTrace()
}
func main() {
go a()
time.Sleep(time.Second)
}
runtime还有很多其他的用法,之后可以挨个试试。