多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
在go中,调度时候也不是每个G都能一直处于运行状态,等G不能运行时,就把它存起来,再调度下一个能运行的G过来运行。暂时不能运行的G,P上会有个本地队列去存放这些这些G,P的本地队列存不下的话,还有个全局队列,干的事情也类似。 在这个这个背景后, 通过goexit0 观察,做的事情就是将当前的协程G置为\_Gdead状态,然后把它从M上摘下来,尝试放回到P的本地队列中。然后重新调度一波,获取另一个能跑的G,拿出来跑。 因此只要执行 goexit 这个函数,当前协程就会退出,同时还能调度下一个可执行的协程出来跑。 通过 runtime.Goexit()可以做到提前结束协程,且结束前还能执行到defer的内容• runtime.Goexit()其实是对goexit0的封装,只要执行 goexit0 这个函数,当前协程就会退出,同时还能调度下一个可执行的协程出来跑