「让我们一起 Golang」让协程自己 kill 自己
「让我们一起 Golang」让协程自己 kill 自己
我们这篇博文讨论 Go 的协程杀掉自己协程的有关内容。这里我们就需要用到runtime.Goexit()
.
先上代码介绍runtime.Goexit()
及其使用方法
如果Goexit
杀掉它的 goroutine,其他 goroutine 也不会受到影响。 Goexit
在终止 goroutine 之前会调用所有延迟函数, 因为 Goexit
不是一个 panic,而这些延迟函数中的任何调用恢复都将返回 nil。从主协程调用 Goexit
会终止主协程,而不会返回主函数func main
。 由于 主函数func main
没有返回,程序会继续执行其他 goroutine。 如果所有其他 goroutine 都终止,那么程序就会崩溃。
在这段代码里面,主函数中是先开辟一条协程,先输出《咏鹅》的第一句诗句,然后进入任务函数。该任务函数是执行在子协程中。
这段代码的运行结果是
这里“红掌拨清波”并没有输出,因为它是在runtime.Goexit()
之后的语句,而此时协程已经被自己杀死了。
但是延迟函数被执行了,Goexit
在终止 goroutine 之前会调用所有延迟函数, 因为 Goexit
不是一个 panic,而这些延迟函数中的任何调用恢复都将返回 nil。所以“拿来吧你”不会输出。
但是作者名”——骆宾王“为什么也没输出呢?思考一下吧。
因为函数 task051()里面将当前协程 kill 掉了。而作者名”——骆宾王“因为协程已经被杀死而执行不到。
前面杀死的是子协程。
我们之前说主协程不能死,那么我们现在杀死主协程看看会怎么样吧!
主协程被杀死之后,所有子协程就会乱了套,不眠不休。
我们先来看看主协程正常结束的样子吧...
运行结果是:
主协程睡觉睡了 5 秒,子协程没睡一秒就说一句“任务进行中...”,所以当主协程结束时,主协程说五句“任务进行中...”。
现在我们杀死主协程看看会出现什么吧!
将上面代码块的runtime.Goexit()
激活,让他能够运行。
看看运行结果吧。
博主等了半分钟,子协程一直在那大喊“任务进行中...”,像极了晚上父母不在家,大喊大叫的熊孩子。
版权声明: 本文为 InfoQ 作者【Regan Yue】的原创文章。
原文链接:【http://xie.infoq.cn/article/e6d91d0049590ac7a718a99f6】。文章转载请联系作者。
评论 (1 条评论)