go高级进阶:goroutine的创建、休眠与恢复


本文摘自网络,作者,侵删。

goroutine切换

goroutine在go代码中无处不在,go程序会根据不同的情况去调度不同的goroutine,一个goroutine在某个时刻要么在运行,要么在等待,或者死亡。
goroutine的切换一般会在以下几种情况下发生:

  1. 基于信号抢占式的调度,一个goroutine如果运行很长,会被踢掉
  2. 发生系统调用,系统调用会陷入内核,开销不小,暂时解除当前goroutine
  3. channel阻塞,当从channel读不到或者写不进的时候,会切换goroutine

关于go的调度可以阅读golang 如何调度你的程序的

管理员-g0

go程序中,每个M都会绑定一个叫g0的初代goroutine,它在M的创建的时候创建,g0的主要工作就是goroutine的调度、垃圾回收等。g0和我们常规的goroutine的任务不同,g0的栈是在主线程栈上分配的,并且它的栈空间有64k,m0是runtime创建第一个线程,然后m0关联一个本地的p,就可以运行g0了。在g0的栈上不断的调度goroutine来执行,当有新的goroutine关联p准备运行发现没有m的时候,就会去创建一个m,m再关联一个g0,g0再去调度...

阅读剩余部分

相关阅读 >>

编写可测试的 Go 代码

Go语言 if…else 语句

Golang 上传office文档并转化为pdf

如何在linux上运行第一个Go程序

Golang 是什么写的

手把手教你实现Golang跨平台编译

关于Go的&和*的区别以及应用场景

手撸Golang 架构设计原则 依赖倒置原则

Golang找不到package怎么办

Go语言适合做哪些开发

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...