Go 并发模式:Timing out, moving on

Posted code_kd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go 并发模式:Timing out, moving on相关的知识,希望对你有一定的参考价值。

并发编程有它自己的习惯用法。一个很好的例子是超时。虽然 Go 的频道不直接支持它们,但它们很容易实现。假设我们要从 channel 接收ch,但最多要等待一秒钟以等待值到达。我们将首先创建一个信号通道并启动一个在通道上发送之前休眠的 goroutine:

timeout := make(chan bool, 1)
go func() 
    time.Sleep(1 * time.Second)
    timeout <- true
()

然后我们可以使用语句从orselect中接收。如果一秒后没有任何消息到达,则选择超时情况并放弃从 ch 读取的尝试。chtimeoutch

select 
case <-ch:
    // a read from ch has occurred
case <-timeout:
    // the read from ch has timed out

通道timeout缓冲有 1 个值的空间,允许超时 goroutine 发送到通道然后退出。goroutine 不知道(或关心)是否收到了值。ch这意味着如果接收发生在超时之前,goroutine 不会永远挂起。该timeout通道最终将由垃圾收集器释放。

(在此示例中,我们用于time.Sleep演示 goroutine 和通道的机制。在实际程序中,您应该使用 [time.After

以上是关于Go 并发模式:Timing out, moving on的主要内容,如果未能解决你的问题,请参考以下文章

Go并发模型:超时,继续(Timing out, moving on译文)

16 Go Concurrency Patterns: Timing out, moving on

Go并发模式:管道与取消

Go语言常见的并发模式

Go 并发模式 - 模式 #2

关于Go语言,你不得不知的并发模式!