合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
在go中,调度时候也不是每个G都能一直处于运行状态,等G不能运行时,就把它存起来,再调度下一个能运行的G过来运行。暂时不能运行的G,P上会有个本地队列去存放这些这些G,P的本地队列存不下的话,还有个全局队列,干的事情也类似。 在这个这个背景后, 通过goexit0 观察,做的事情就是将当前的协程G置为\_Gdead状态,然后把它从M上摘下来,尝试放回到P的本地队列中。然后重新调度一波,获取另一个能跑的G,拿出来跑。 因此只要执行 goexit 这个函数,当前协程就会退出,同时还能调度下一个可执行的协程出来跑。 通过 runtime.Goexit()可以做到提前结束协程,且结束前还能执行到defer的内容• runtime.Goexit()其实是对goexit0的封装,只要执行 goexit0 这个函数,当前协程就会退出,同时还能调度下一个可执行的协程出来跑