使用 select 实现 goroutine 超时
虽然携程是Go语言中一个新的概念,嗯,但它本质上依然是属于多线程。超时机制是多线程中是一个非常重要的保障程序的鲁棒性的一个措施;错误是很难预估的,在多线程中更为显著,更容易出现难以预料的错误。
- 一个异常场景
在go语言中使用channel时需要小心,比如这个用法
i := <-ch
不出问题的话这个是一个很简单的,从ch中读取数据到i中。
但如果ch一直没有人往ch中写数据,那么这个读取动作也就一直无法执行,结果就是这个goroutine将会一直阻塞在这里。
有些人可以说,代码仅仅是我自己使用,我技术高超,不会出现这种低级错误;但往往代码并不是孤立了,通常都会别人使用(ctrl+v 或者参考),一旦对外公开,那么难免会出现这种问题。
所以对于这个,我们需要知道如何使用超时机制保护goroutine不被一直阻塞
go的超时机制
Go语言本身并没有原生的支持超时机制,但是我们可以使用select机制,虽然它并不是专门为超时机制而设计的。
基于上面的问题,如下是一个简易的超时机制处理
timeout := make(chan bool, 1) go func() { time.Sleep(1e9) timeout <- true } () select { case <- ch: //从ch中读取数据 case <-timeout: //ch一直没有数据写入,超时触发timeout }
转自:
http://blog.csdn.net/qq_15437667/article/category/6128870
http://blog.csdn.net/qq_15437667/article/details/52961671
使用 select 实现 goroutine 超时的更多相关文章
- go语言之进阶篇 select实现的超时机制
1.select实现的超时机制 示例: package main import ( "fmt" "time" ) func main() { ch := mak ...
- Select模式和超时
fd_set rset; FD_ZERO(&rset); int nready; int maxfd; int fd_stdin = fileno(stdin); if(fd_stdin &g ...
- select 设置发送超时发送注意事项
//设置发送超时你只发送, 并发送足够多的数据以填满发送缓冲区, 接收端一直不接收.发送端一量满发送缓冲区就会阻塞, 如果你设置了发送超时, 超时到了它就会返回发送超时了. 在send(),recv( ...
- 【Go入门教程7】并发(goroutine,channels,Buffered Channels,Range和Close,Select,超时,runtime goroutine)
有人把Go比作21世纪的C语言,第一是因为Go语言设计简单,第二,21世纪最重要的就是并行程序设计,而Go从语言层面就支持了并行. goroutine goroutine是Go并行设计的核心.goro ...
- 【Go入门教程9】并发(goroutine,channels,Buffered Channels,Range和Close,Select,超时,runtime goroutine)
有人把Go比作21世纪的C语言,第一是因为Go语言设计简单,第二,21世纪最重要的就是并行程序设计,而Go从语言层面就支持了并行. goroutine goroutine是Go并行设计的核心.goro ...
- Golang利用select实现超时机制
所谓超时,比如上网浏览一些安全的网站,如果几分钟之后不做操作,那么就会让你重新登录.就所谓有时候出现goroutine阻塞的情况,那么我们如何避免整个程序进入阻塞情况,这时候就可以用select来设置 ...
- 套接字IO超时设置和使用select实现超时管理
在涉及套接字IO超时的设置上有一下3种方法: 1.调用alarm,它在指定的时期满时产生SIGALRM信号.这个方法涉及信号的处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm ...
- UNIX网络编程——使用select 实现套接字I/O超时
下面程序包含read_timeout.write_timeout.accept_timeout.connect_timeout 四个函数封装: /* read_timeout - 读超时检测函数,不含 ...
- 套接字I/O超时设置方法和用select实现超时
注:如无特殊说明,sockfd 原始状态都是阻塞的. 一.使用alarm 函数设置超时 C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 void handler( ...
随机推荐
- python字符串前带u,r,b的含义
1. https://www.cnblogs.com/yanglang/p/7416889.html 2.https://blog.csdn.net/teavamc/article/details/7 ...
- js动态规划---背包问题
//每种物品仅有一件,可以选择放或不放 //即f[i][w]表示前i件物品恰放入一个容量为w的背包可以获得的最大价值. //则其状态转移方程便是:f[i][w]=max{f[i-1][w],f[i-1 ...
- JavaScriptSerializer的日期转换方案
1.转换后过滤替换(通用) /// <summary> /// 日期转换 /// </summary> /// <param name="str"&g ...
- CI持续集成系统环境--Gitlab+Gerrit+Jenkins完整对接
原文地址https://www.cnblogs.com/kevingrace/p/5651447.html 近年来,由于开源项目.社区的活跃热度大增,进而引来持续集成(CI)系统的诞生,也越发的听到更 ...
- cocos2d JS 创建实现换行功能的聊天文本 testLable
-- 创建实现换行功能的文本 function LoadLabelHeroIntroduce(objLabelContent) //传入文本 ---------------------------- ...
- cocos2dx (关于斗地主人物偏移位置)
就是说不管是谁登陆游戏,你的人物信息资料始终在平板电脑的屏幕正下方(位置坐标需要自己设定,我设置定的是0号位() char LandLordsScene::getUIPosition(char pos ...
- 49.CSS--- 特殊css3效果展示
1.设置多行文本超出显示省略号<div class="caption"> <p>显示超过两行就显示省略号,其余隐藏,隐藏不了的情况下给这个模块添加一个高度和 ...
- HDU 2604 Queuing(递推+矩阵)
Queuing [题目链接]Queuing [题目类型]递推+矩阵 &题解: 这题想是早就想出来了,就坑在初始化那块,只把要用的初始化了没有把其他的赋值为0,调了3,4个小时 = = 本题是可 ...
- CentOS双机中Docker下安装Mysql并配置互为主从模式
CentOS双机中Docker下安装Mysql并配置互为主从模式 目录 1.搜索镜像... 1 2.拉取镜像... 1 3.绑定端口: 1 4.配置文件(修改/etc/mysql/my.cnf文件): ...
- sudo安装某一文件报错:E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?
报错原因:资源被占用 解决方法: sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock