最近有一个需求是在一个常驻内存的程序中结束相关任务。在Go中,创建一个goroutine非常简单,只需要go一下就可以了,但是如果我创建了很多goroutine,想要结束怎么办?
比如说我有一个死循环的例子
如何在一个goroutine里面控制所有的goroutine,让所有的goroutine结束呢?这就需要select出场了。有人告诉我,这样子实现会更好一些:
但是输出却是比较让人困惑:
看起来停止的时间有15s,比预想的10s时间要长一些,这是为什么呢?
这里select的作用是,在遇到channel case时,尝试所有的channel是否为ready;若有一个为ready,则执行该case,多个case时会随机执行其中一个case;如果有default,则会在所有都not ready时执行;没有default的话就wait等待ready。
关于select的随机性,用一个例子来说明更方便一些:
输出结果如下:
那这样上面还是会出现那种有可能没退出的情况,这样怎么做呢?下面我个人感觉会是一种更好的做法:
还有一个值得注意的事情就是,对select来说,整体的运行相当于一个循环分支处理的过程。对case来说,过程是一个block的过程,比如说在执行default过程中,即使收到了来自EXIT的信息,也不会中断执行default去跳转执行EXIT,而是在default完成之后,进入条件分支选择使优先进入channel已经ready的case。
有疑问加站长微信联系(非本文作者)