go语言中多个并发程序的数据同步是采用通道来传输,比如v:=<-chan,从通道里读取数据到v,是一个阻塞操作。可是如通道里没有数据写入,就是chan<-data,这样写入通道的操作,在读操作时就会一直阻塞,需要加入一个超时机制来进行判断。

具体的超时设计是通过使用select和case语句,类似于switch和case,在每一个case里进行一个io操作,比如读或者写,在最后一个case里调用time包里的After方法,可以达到超时检测效果。参考下面例子1

当然,如写入端在写入通道结束后,调用close(chan)关闭通道。在读取端,就会读到一个该通道类型的空值,如是int就是0,如是string就是""空字符串,可以根据这个空值来判断,或者使用两个返回值来读取通道:v,br:=<-chan,这里第2个参数br是一个bool变量,表示通道是否关闭。参考下面例子2

例子1如下:

package mainimport ("fmt""time"
)func main() {ch := make(chan string, 2)//定义了缓冲长度2的通道,类型是字符串,可以连续写入2次数据go func(c chan string) {for i := 0; i < 3; i++ {str := fmt.Sprintf("%d", i)c <- strtime.Sleep(time.Millisecond * 10)}}(ch)go func(c chan string) {for i := 10; i < 13; i++ {str := fmt.Sprintf("%d", i)c <- strtime.Sleep(time.Millisecond * 10)}}(ch)timelate := 0 //定义超时次数for {time.Sleep(time.Millisecond * 2000) //每隔2秒读取下管道select {case i := <-ch:fmt.Println("通道读取到:", i)case <-time.After(time.Second * 2): // 等待2秒超时,这里time.After 返回一个只读通道,就是当前时间值timelate++fmt.Printf("通道接收超时,第%d次\n", timelate)if timelate > 2 {goto end}}}
end:fmt.Println("退出88")
}

例子2,演示了close关闭通道,使用2个返回值来读取通道,获取通道关闭状态。

package mainimport ("fmt""time"
)func main() {ch := make(chan string, 2) //定义了缓冲长度2的通道,类型是字符串,可以连续写入2次数据go func(c chan string) {for i := 0; i < 3; i++ {str := fmt.Sprintf("%d", i)c <- strtime.Sleep(time.Millisecond * 10)}}(ch)go func(c chan string) {for i := 10; i < 13; i++ {str := fmt.Sprintf("%d", i)c <- strtime.Sleep(time.Millisecond * 10)}time.Sleep(time.Millisecond * 1000) //专门给这个协程加个1秒的延时,让它晚退出会,好调用close关闭通道。close(c)}(ch)timelate := 0 //定义超时次数for {time.Sleep(time.Millisecond * 2000) //每隔2秒读取下管道select {case i, br := <-ch: //从通道里读取2个返回值,第2个是通道是否关闭的bool变量if !br { //如果是false,表示通道关闭fmt.Println("通道关闭了")goto end}fmt.Println("通道读取到:", i)case <-time.After(time.Second * 2): // 等待2秒超时,这里time.After 返回一个只读通道,就是当前时间值timelate++fmt.Printf("通道接收超时,第%d次\n", timelate)if timelate > 2 {goto end}}}
end:fmt.Println("退出88")
}

对于例子2来说,这里因为在通道写入端用close关闭通道了,所以case <-time.After这个方法的超时就不起作用了。这里暂且保留着吧。

go语言基于time.After通道超时设计和通道关闭close相关推荐

  1. 热电偶单片机代码c语言,基于单片机的热电偶发生器设计(含电路原理图,程序)...

    基于单片机的热电偶发生器设计(含电路原理图,程序)(课题申报表,任务书,开题报告,中期检查表,外文翻译,论文15000字,程序,答辩PPT) 摘 要 热电偶标准信号发生器为袖珍式键控现场检测仪表.其由 ...

  2. 万年历设计单片机c语言,基于单片机的电子万年历设计(含电路图,Proteus仿真程序)...

    基于单片机的电子万年历设计(含电路图,Proteus仿真程序)(论文11000字,Proteus仿真程序) 摘    要 万年历作为日常生活中重要的时间显示设备,在人们的外出旅游和日常生活中都发挥了重 ...

  3. 热电偶单片机代码c语言,基于STC12C5A60S2单片机的恒温箱设计-LCD1602-热电偶(电路图+程序源码)...

    https://v.youku.com/v_show/id_XNDc2NzY1MDY2NA==.html?spm=a2hzp.8253869.0.0 2017-468.STC12C5A60S2恒温箱设 ...

  4. 单片机c语言出租车计时程序,基于单片机出租车计价器课题设计c语言编写(样例3)...

    <基于单片机出租车计价器课题设计(c语言编写).doc>由会员分享,可免费在线阅读全文,更多与<基于单片机出租车计价器课题设计(c语言编写)>相关文档资源请在帮帮文库(www. ...

  5. C语言设计窗帘自动拉伸,基于st8952的自动窗帘设计.doc

    基于st8952的自动窗帘设计.doc 福建电力职业技术学院 课程名称:<智能仪器> 题目:基丁 STC89C52的简易计算器设计 专业班次: 姓 名: 学 号: 指导教师: 学期:201 ...

  6. matlab hod on,基于Matlab语言定量反馈控制器的分析与设计_朱永文

    计算机测量与控制. 2002. 10( 12) 822 Computer Measurement & Control 文章编号: 1671- 4598( 2002) 12- 0822- 02 ...

  7. 台灯c语言,基于msp430单片机的智能台灯设计(C语言).doc

    基于msp430单片机的智能台灯设计(C语言) 桂林理工大学信息学院 实 习 报 告 实习名称: 电子系统设计创新与实践 名: 学 号: 组 员: 指导老师: 实习时间: 目 录1概述3 1.1 题目 ...

  8. 数字温度计的c语言编程,基于DS18B20数字温度计的设计(全文完整版)

    <基于DS18B20数字温度计的设计.doc>由会员分享,可免费在线阅读全文,更多与<基于DS18B20数字温度计的设计>相关文档资源请在帮帮文库(www.woc88.com) ...

  9. 脉冲时间宽度c语言,基于AT89C52脉冲宽度测量仪的设计与实现

    赵翠玉 摘要:本文基于AT89C52的脉冲宽度测量仪的设计.该仪器测量结果采用了软件数字滤波,消除了测量中抖动问题,测量精度高.稳定性好,具有一定的实用性. 关键词:AT89C52;测量仪;脉冲宽度 ...

最新文章

  1. 今日推荐:如何设计一个支撑数亿用户的系统
  2. Axure下拉框级联操作
  3. 使用 CefSharp 在 C# App 中嵌入 Chrome 浏览器
  4. linux 进程 释放内存,Linux 释放内存方法和原理
  5. LeetCode 810. 黑板异或游戏(博弈推理)
  6. java工程编辑器中文乱码_Java Web开发项目中中文乱码解决方法汇总
  7. 如何选择合适的网站程序
  8. 主成分分析(PCA)实现代码
  9. python 大智慧自定义数据_大智慧自定义数据
  10. UDS知识整理(二):UDS诊断服务简介
  11. 基于udp端口转发程序设计(一)
  12. 线性代数笔记【空间向量】
  13. python 概率分布模型_使用python的概率模型进行公司估值
  14. 7. 模糊操作/原理/API/种类/边缘保留
  15. 中点画椭圆算法_中点圆算法
  16. 纯CSS制作3D动态相册【流星雨3D旋转相册】HTML+CSS+JavaScriptHTML5七夕情人节表白网页制作
  17. proto2java
  18. python dfs
  19. STM32 CubeMx教程 -- 基础知识及配置使用教程
  20. 上海出租车颜色 失物招领电话

热门文章

  1. 配流02—DIAL算法(改进)
  2. 转载: 房贷的两种还款方式介绍
  3. Altium Designer 原理图如何统计Pins数目
  4. 投屏镜像工具玩手机游戏的优势
  5. 数据圈最全的数据产品文章全集
  6. CodeForces 13A - Numbers
  7. Android:收不到应用卸载、替换、安装等广播
  8. nvd3.js 关于子弹图如何格式化刻度线标签问题
  9. IOS——获取当前运营商(获取漫游接入网络的运营商)
  10. python pty模块 - 作用1 - 虚拟一个串口