golang中runtime.Gosched()的理解

runtime.Gosched()用于让出CPU时间片。这就像跑接力赛,A跑了一会碰到代码runtime.Gosched()就把接力棒交给B了,A歇着了,B继续跑。

看代码:

package main

 

import (

"fmt"

"runtime"

)

 

func say(s string) {

for i := 0; i < 2; i++ {

runtime.Gosched()

fmt.Println(s)

}

}

 

func main() {

go say("world")

say("hello")

}

 

输出结果:

hello

world

hello

注意结果:

1、先输出了hello,后输出了world.

2、hello输出了2个,world输出了1个(因为第2个hello输出完,主线程就退出了,第2个world没机会了)

把代码中的runtime.Gosched()注释掉,执行结果是:

hello

hello

因为say("hello")这句占用了时间,等它执行完,线程也结束了,say("world")就没有机会了。

这里同时可以看出,go中的goroutins并不是同时在运行。事实上,如果没有在代码中通过

runtime.GOMAXPROCS(n) 其中n是整数,

指定使用多核的话,goroutins都是在一个线程里的,它们之间通过不停的让出时间片轮流运行,达到类似同时运行的效果。

 

还需要学习一句话:

当一个goroutine发生阻塞,Go会自动地把与该goroutine处于同一系统线程的其他goroutines转移到另一个系统线程上去,以使这些goroutines不阻塞

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值