Go 协程权限调度包runtime
  Eo7GKm3ms3Sh 2023年11月02日 27 0


创作不易感谢支持。
一条主写Go和PHP的小菜鸟。平常有时间喜欢自己写点东西,如有不对的地方,欢迎大佬指点。 

Go 协程权限调度包runtime

runtime里的三个函数Gosched、Goexit、GOMAXPROCS

Gosched:让出cpu时间切片。用于让出当前grouting的执行权限,调度器安排其他等待的goroutine执行任务,并在某个位置恢复执行

Goexit:终止当前的goroutine执行,并不会影响其他的goroutine执行。并在终止当前的goroutine之前,执行还未执行的defery语句. 如果Goexit在main函数中执行会报panic

GOMAXPROCS: 用来设置可以并行计算的CPU核数最大值,并返回之前的值。 1~256 最好在主函数之前设置,否则会终止当前的任务执行

Go 默认是一个cpu核的,可以通过GOMAXPROCS来设置

Gosched:

不加Gosched, 子协程并不会打印出来

func main() {
  // 子协程
	go func() {
		for i := 0; i < 2; i++ {
			fmt.Println("会打印吗")
		}
	}()

	// 主协程
	for i := 0; i < 2; i++ {
		fmt.Println("我会打印!!!!")
	} 
}

结果:

我会打印!!!!
我会打印!!!!

加Gosched, 子协程就可以打印出来

func main() {
  	go func() {
		for i := 0; i < 2; i++ {
			fmt.Println("会打印吗")
		}
	}()

	// 主协程
	for i := 0; i < 2; i++ {
		runtime.Gosched()
		fmt.Println("我会打印!!!!")
	}
}

结果:

会打印吗
会打印吗
我会打印!!!!
我会打印!!!!

Goexit:

func test() {
	defer fmt.Println("还未执行的defer语句")
	runtime.Goexit()
	fmt.Println("这条信息还能打印吗????")
}

func main() {
  // 子协程
	go func() {
		fmt.Println("哈哈哈哈哈哈哈")
		test()
		fmt.Println("来打我呀!!!!!")
	}()

  // 死循环,为了不让主协程退出
	for {

	}
}

结果:

哈哈哈哈哈哈哈
还未执行的defer语句

GOMAXPROCS:

func main() {

	runtime.GOMAXPROCS(2)

	for {
		go fmt.Println("go")
		fmt.Print(0)
	}
}


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

Eo7GKm3ms3Sh
最新推荐 更多

2024-05-03