runtime.Gosched()让出cpu的时间片,让出当前协程的执行权限,调度器安排其他等待的任务运行,并在下次某个时间从该位置恢复执行
和协程 yield 作用类似
func main() {
go func() {
for i := 0; i < 5; i++ {
//不一定打印5次
fmt.Println("go")
}
}() //别忘记()
for i := 0; i < 2; i++ {
//让出我的时间片
runtime.Gosched()
fmt.Println("hello")
}
}
Goexit
调用runtime.Goexit()将立即终止当前协程运行,调度器确保所有已注册defer延迟调用执行
有时候我们会遇到这个问题
调度器确保所有已注册defer延迟调用被执行,要在Goexit之前注册
func test() {
defer fmt.Println("test-------")
return //终止使用此函数
fmt.Println("1111111111")
}
func main() {
go func() {
fmt.Println("aaaa")
//调用了别的函数
test()
//没打印
fmt.Println("bbb")
}() //别忘记()
for {
}
}
输出
aaaa
test-------
bbb
func test() {
defer fmt.Println("test-------")
//终止这个协程
runtime.Goexit()
//return
fmt.Println("1111111111")
}
func main() {
go func() {
fmt.Println("aaaa")
//调用了别的函数
test()
//没打印
fmt.Println("bbb")
}() //别忘记()
for {
}
}
输出
aaaa
test-------
GOMAXPROCS
调用runtime.GOMAXPROCS()用来设置可以并行计算的cpu核数的最大值,并返回之前的值
func main() {
//指定核数
n := runtime.GOMAXPROCS(2)
fmt.Println(n)
}
多任务资源竞争
//定义一个打印机
//打印机属于公共资源
func Printer(str string) {
for _, data := range str{
fmt.Printf("%c", data)
time.Sleep(time.Second)
}
fmt.Printf("\n")
}
func Person1() {
Printer("hello")
}
func Person2() {
Printer("world")
}
func main() {
//新建2个协程,代表2个人,2个人同时使用打印机
go Person1()
go Person2()
//特意不让主协程结束,死循环
for {
}
}
打印会乱掉
我们如何让他同步呢
返回go的根目录,存在GOROOT环境变量返回该环境变量,不存在返回go的根目录
func GOROOT() string
版本
func Version() string
cpu个数
func NumCPU() int
GC
func GC()
查看时间
go build main.go
time -p ./main
输出结果:
0 9223372030412324865
1 9223372030412324865
real 1.92 // 程序开始到结束时间差 ( CPU 时间)
user 3.80 // 用户态所使用 CPU 时间片 (多核累加)
sys 0.01 // 内核态所使用 CPU 时间片
命令行输入:
GOMAXPROCS=8 time -p ./main
输出结果:
1 9223372030412324865
0 9223372030412324865
real 1.89
user 3.76 // 虽然总时间差不多,但由 2 个核并行,real 时间自然少了许多。
sys 0.00