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译文)