并发编程有它自己的习惯用法。一个很好的例子是超时。虽然 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
上一篇:如何为系统可靠性的量化提供依据
下一篇:keychron机械键盘使用感受