首页 > 代码库 > 使用 select 实现 goroutine 超时

使用 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 超时