Go语言没有提供直接的超时处理机制,所谓超时可以理解为当我们上网浏览一些网站时,如果一段时间之后不作操作,就需要重新登录。

那么我们应该如何实现这一功能呢,这时就可以使用 select 来设置超时。

虽然 select 机制不是专门为超时而设计的,却能很方便的解决超时问题,因为 select 的特点是只要其中有一个 case 已经完成,程序就会继续往下执行,而不会考虑其他 case 的情况。

超时机制本身虽然也会带来一些问题,比如在运行比较快的机器或者高速的网络上运行正常的程序,到了慢速的机器或者网络上运行就会出问题,从而出现结果不一致的现象,但从根本上来说,解决死锁问题的价值要远大于所带来的问题。

select 的用法与 switch 语言非常类似,由 select 开始一个新的选择块,每个选择条件由 case 语句来描述。

与 switch 语句相比,select 有比较多的限制,其中最大的一条限制就是每个 case 语句里必须是一个 IO 操作,大致的结构如下:

select {

case

// 如果chan1成功读到数据,则进行该case处理语句

case chan2

// 如果成功向chan2写入数据,则进行该case处理语句

default:

// 如果上面都没有成功,则进入default处理流程

}

在一个 select 语句中,Go语言会按顺序从头至尾评估每一个发送和接收的语句。

如果其中的任意一语句可以继续执行(即没有被阻塞),那么就从那些可以执行的语句中任意选择一条来使用。

如果没有任意一条语句可以执行(即所有的通道都被阻塞),那么有如下两种可能的情况:

如果给出了 default 语句,那么就会执行 default 语句,同时程序的执行会从 select 语句后的语句中恢复;

如果没有 default 语句,那么 select 语句将被阻塞,直到至少有一个通信可以进行下去。

示例代码如下所示:

package main

import (

"fmt"

"time"

)

func main() {

ch := make(chan int)

quit := make(chan bool)

//新开一个协程

go func() {

for {

select {

case num :=

fmt.Println("num = ", num)

case

fmt.Println("超时")

quit

}

}

}() //别忘了()

for i := 0; i < 5; i++ {

ch

time.Sleep(time.Second)

}

fmt.Println("程序结束")

}

运行结果如下:

num =  0

num =  1

num =  2

num =  3

num =  4

超时

程序结束

golang mysql 超时_Go语言channel超时机制相关推荐

  1. golang goroutine实现_Go语言潜力有目共睹,但它的Goroutine机制底层原理你了解吗?...

    来源 | 后端技术指南针(ID:gh_ed1e2b37dcb6) Go语言的巨大潜力有目共睹,今天我们来学习Go语言的Goroutine机制,这也可能是Go语言最为吸引人的特性了,理解它对于掌握Go语 ...

  2. go iris 连接 mysql 异步_go语言解决并发的方法有哪些?

    简单回答下! 如果你只是一个 IO 操作,没必要在处理函数(协程)再开子协程,没什么用.因为,无论你开不开协程,都需要等待这个 IO 完成.一个 IO 操作,并发启不到提高性能的作用. 如果要提高性能 ...

  3. go语言mysql视频_Go语言实战流媒体视频网站

    第1章 课程介绍 介绍这门课程大纲,技术堆栈以及环境 1-1 prestudy 1-2 课程介绍及知识要点预习 第2章 一个例子了解golang工具链 通过一个简单的webservice具体从gola ...

  4. go mysql教学_Go语言之对Mysql简单操作

    操作mysql用到的库是sqlx 需要先安装sqlx和mysql,sqlx是在mysql驱动之上封装的包 go get "github.com/go-sql-driver/mysql&quo ...

  5. mysql 活锁_Go语言死锁、活锁和饥饿概述

    本节我们来介绍一下死锁.活锁和饥饿这三个概念. 死锁 死锁是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状 ...

  6. golang定义空指针_Go语言指针声明及操作方法

    指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值.由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元.因此,将地址形 ...

  7. golang mysql 超时_golang中mysql建立连接超时时间timeout 测试

    本文测试连接mysql的超时时间. 这里的"连接"是建立连接的意思. 连接mysql的超时时间是通过参数timeout设置的. 1.建立连接超时测试 下面例子中,设置连接超时时间为 ...

  8. mysql大表联合查询优化,大事务优化,规避事务超时,锁等待超时与锁表

    背景:最近在做项目的同时做了一些优化,主要针对mysql大表(2亿+数据量未分库分表情况下)的联合查询以及生产上出现的一些事务超时和锁等待超时现象的优化,分享一些我个人的优化思路,只讲思路不贴代码哈. ...

  9. mysql数据库断开连接_解决mysql服务器在无操作超时主动断开连接的情况

    我们在使用mysql服务的时候,正常情况下,mysql的设置的timeout是8个小时(28800秒),也就是说,如果一个连接8个小时都没有操作,那么mysql会主动的断开连接,当这个连接再次尝试查询 ...

最新文章

  1. CentOS Linux解决 Device eth0 does not seem to be present
  2. 一文带你看懂Spring事务!
  3. leetcode 268. Missing Number
  4. C++ Opengl绘制3D源码
  5. 面试题——20190717
  6. STL中的lower_bound和upper_bound的理解
  7. java交换数组元素_交换数组中的元素(Java)
  8. html阶梯统计,html,_有什么图表可以显示阶梯费率,html - phpStudy
  9. element-ui可编辑行增加行或删除行
  10. Python调用Matlab教程
  11. 计算机网络的现状分析,计算机网络技术的发展现状和趋势分析.doc
  12. 手机内存如何快速自清理
  13. 一元三次方程求解matlab_为什么一元n次代数方程必有n个根?
  14. word文档中如何将软回车替换为硬回车
  15. 电子白板功能的设计与实现
  16. 前端页面中根据链接随机生成二维码
  17. 什么是穿透式监管,需要投资者做什么?
  18. 每月一书(202112):《王阳明心学》
  19. 爬虫学习(一)---爬取电影天堂下载链接
  20. mysql商品查询_MYSQL——怎么一个sql语句查询出用户和用户商品的列表啊

热门文章

  1. anconda设置镜像源_管理2000+Docker镜像,Kolla是如何做到的
  2. csdn博客搭建自定义模块
  3. 基于JAVA+SpringBoot+Mybatis+MYSQL的高校排课系统
  4. 畅通工程---并查集
  5. MVC中某个页面不需要引用母版页的正确写法
  6. SQL优化:化解表关联的多对多join
  7. jQuery-处理元素内容、表单元素
  8. Hibernate面试题收藏
  9. 2016/1/14 java随机数生成
  10. UIKit框架-高级控件Swift版本: 6.UIAlertView方法/属性详解