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. php概率函数,PHP全概率运算函数(优化版) Webgame开发必备
  2. 浙大机器鱼登Nature封面!22cm身段,探索地球最深海沟
  3. 渣硕 面 用友软件 Java开发
  4. vue 无法进入response拦截器_vue拦截器的一次实践
  5. SAP里删除trace文件的方法
  6. 关于EOF,转自新浪微博
  7. Maven搭建Spring Security3.2项目详解
  8. SecureCRT官方下载地址
  9. 查看dSYM文件的UUID
  10. 《韩立刚计算机网络》第二章
  11. 蚂蚁金服(实习)凉经
  12. 驾驶证北京到期满换证  异地期满换领  异地驾驶证到期在北京换证 驾驶证异地换证
  13. css方块跳动且颜色变化,CSS3 波动的方块
  14. Android时间轴,RecyclerView实现
  15. Python 标准库之 random 生成伪随机数『详细』
  16. scikit-opt的使用
  17. NLog NETCore 3.0 Porting
  18. 做自适应网站专业乐云seo_网站建设技术很 棒乐云seo:SEO技术这碗青春饭,跪
  19. 子线程设置的钩子(HOOK)为什么钩不到消息?
  20. 定时器 setTimeout(),setInterval() 清除定时器

热门文章

  1. 基于JAVA+SpringBoot+Mybatis+MYSQL的社团管理系统
  2. SSM项目启动报错More than one fragment with the name [spring_web] was found. This is not legal with relativ
  3. java 链表逆转_java 实现单链表逆转详解及实例代码
  4. w2008 R2 401 - 未授权: 由于凭据无效,访问被拒绝。
  5. 遇见JMS[1] —— activeMQ的简单使用
  6. PHP数据结构之四 一元多项式的相加PHP单链实现
  7. iOS开发-CocoaPods使用详细说明
  8. hdu 1559 最大子矩阵 (简单dp)
  9. 文档管理系统 OpenKM
  10. linux 查找文件 mysql数据库_Linux下MySQL数据库目录多了好多文件