使用 select 实现 goroutine 超时

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 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 超时的主要内容,如果未能解决你的问题,请参考以下文章

Go基础系列:指定goroutine的执行顺序

使用带有选择的通道时的 Goroutine 死锁

Go-并发模式2(Patterns)

Gochannel超时机制触发的(fatal error: all goroutines are asleep - deadlock!)

golang channel 超时如何处理

Golang 基础:原生并发 goroutine channel 和 select 常见使用场景