这篇文章主要介绍了golangselect机制和超时问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇golangselect机制和超时问题怎么解决文章都会有所收获,下面我们一起来看看吧。golang 中的协程使用非常方便,但是协程什么时候结束是一个控制问题,可以用 select 配合使用。子协程和父协程的通信通常用 context 或者 chan。我遇到一个通常的使用场景,在子协程中尝试多次处理,父协程等待一段时间超时,我选择用 chan 实现。我以为 select 和 C++ 中 switch 类似,所以最开始代码类似如下:测试发现无法实现 timeout,又仔细查看文档,才发现 golang 中 select 另有玄机。废话少说,直接总结要点:select 中的 case 必须是进行 chan 的手法操作,也就是只能在 case 中操作 chan,并且是非阻塞接收。select 中的 case 是同时监听的,多个 case 同时操作,并未 switch 中一个个顺序判断。如果多个 case 满足要求,随机执行一个,如果一个没有则阻塞当前的协程(没有 default 情况下)。很类似 Linux 文件符操作的 select 语义。上面说的阻塞是没有 default 的情况下,如果有 default,则执行 default,然后退出 select,也就是不会阻塞当前协程。回到上述代码,我这个 select 会一直不断的执行 default,time.After
生成的 chan 并不会被阻塞判断,所以根本无法完成我想要的效果。理解了之后重新修改代码:开一个新的协程去不断尝试,在外的三个 case 有一个满足,则会执行。但是这里有一个问题非常需要注意:子协程什么时候退出?。因为 gorountine 不能被强制 kill,所以在上述超时的情况下,select 语句执行case time.After
之后退出,done
这个 chan 已经没有接受方了,因此既没有接受者,又没有缓冲区,结合 chan 的特性,则子协程会一直阻塞无法退出,所以本质上这个实现会导致子协程累积下去,也就是协程泄露,可能会使资源耗尽。如何避免上述问题呢?一个很简单的想法就是提供缓冲区,done := make(char int, 1)
,这样即使没有接收方,子协程也能完成发送,不会被阻塞。还要一种办法,上面说了,select 操作 chan,并且可以指定 defaul免费云主机域名t,那是不是有思路了呢?关于“golangselect机制和超时问题怎么解决”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“golangselect机制和超时问题怎么解决”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注百云主机行业资讯频道。
本篇内容介绍了“React组件状态下移和内容提升怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!两个简单实用的优化组件渲染性能的方法:状态下移内容提升在讲…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。