文档章节

golang学习的点点滴滴:并发超时处理

亓斌哥哥
 亓斌哥哥
发布于 2014/10/01 10:41
字数 214
阅读 1711
收藏 11

golang并没有在语言层次上提供超时操作,但可以通过一些小技巧实现超时。

原理:

并发一个函数,等待1s后向timeout写入数据,在select中如果1s之内有数据向其他channel写入则会顺利执行,如果没有,这是timeout写入了数据,则我们知道超时了。

package main 
import "fmt"
import "time"

func main() {
	ch := make(chan int, 1)
	timeout := make(chan bool, 1)

	// 并发执行一个函数,等待1s后向timeout写入true
	go func() {
		time.Sleep(1000)
		timeout <- true
	}()


	// 这里会等待ch或timeout读出数据
	// 因为一直没有向ch写入数据
	// 在1s后向timeout写入了数据
	// 所以执行了timeout的case
	// 利用这个技巧可以实现超时操作
	select {
		case <- ch :
			fmt.Println("read from ch")
		case <- timeout :
			fmt.Println("time out...")
	}
}


© 著作权归作者所有

亓斌哥哥

亓斌哥哥

粉丝 29
博文 34
码字总数 12346
作品 13
莱芜
程序员
私信 提问
加载中

评论(2)

jackluo
jackluo
time.after(3000*time.Seconnd0 这个可以实现 超时
龙上
龙上
这个语句有点问题啊..
Golang 学习笔记(06)—— 多线程

本文为转载,原文:Golang 学习笔记(06)—— 多线程 Golang 介绍 线程是cpu调度的最小单位,只有不同的线程才能同时在多核cpu上同时运行。但线程太占资源,线程调度开销大。go中的gorouti...

ChainZhang
2017/12/26
0
0
在windows下配置Eclipse + go环境 Eclipse平台下配置Go语言开发环境(Win

mongoDB: mongoDB数据库基本操作 Programming in Go (Golang) – Setting up a Mac OS X Development Environment 造完美的go开发环境 在windows下配置Eclipse + go环境 Eclipse平台下配置G......

d_watson
2016/06/03
27
0
Goroutine + Channel 实践

goroutine不同于thread,threads是操作系统中的对于一个独立运行实例的描述,不同操作系统,对于thread的实现也不尽相同;但是,操作系统并不知道goroutine的存在,goroutine的调度是有Golan...

黑神领主
2016/12/10
128
0
用 500 行 Golang 代码实现高性能的消息回调中间件

用500行 Golang 代码实现高性能的消息回调中间件 本文描述了如何实现一个消息回调中间件,得益于 golang 管道和协程的编程思想,通过巧妙的设计,只需要约500行代码就可以实现高性能、优雅关...

zamia
2017/09/24
0
0
Golang 中的并发限制与超时控制

前言 上回在 用 Go 写一个轻量级的 ssh 批量操作工具 里提及过,我们做 Golang 并发的时候要对并发进行限制,对 goroutine 的执行要有超时控制。那会没有细说,这里展开讨论一下。 以下示例代...

小冯冯
2018/02/09
49
0

没有更多内容

加载失败,请刷新页面

加载更多

定期批量改密,实现高效运维,保障口令安全

随着企业IT资产规模的不断增大,各类主机、应用系统的管理也变得愈加困难。 对于系统管理员来说,保证操作系统的密码安全是其重要工作,在需要维护众多的主机时,其面临的困境将是: 1、难以...

堡垒啊
19分钟前
2
0
怎样在磁盘上查找MySQL表的大小?这里有答案

导读 我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎。不应该在 INFORMATION_SCHEMA.TABLES 中提供这些信息吗?没那么简单! 我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎...

问题终结者
45分钟前
6
0
jQuery load() 方法实现加载远程数据

jQuery load() 方法是简单但强大的 AJAX 方法。load() 方法从服务器加载数据,并把返回的数据放入被选元素中。 语法: $(selector).load(URL,data,callback);必需的 URL 参数规定您希望加载的...

前端老手
47分钟前
5
0
Spring Boot缓存实战 Redis 设置有效时间和自动刷新缓存-2

问题 上一篇Spring Boot Cache + redis 设置有效时间和自动刷新缓存,时间支持在配置文件中配置,说了一种时间方式,直接扩展注解的Value值,如: @Override@Cacheable(value = "people#${s...

xiaolyuh
55分钟前
10
0
怎样在磁盘上查找MySQL表的大小?这里有答案

我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎。不应该在 INFORMATION_SCHEMA.TABLES 中提供这些信息吗?没那么简单! 我想知道 MySQL 表在磁盘上占用多少空间,但看起来很琐碎。不应...

Linux就该这么学
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部