Golang中暂停代码执行的各种方法
Golang中暂停代码执行的各种方法 以下两个 goroutine 似乎执行完全相同的操作:
goroutine 1:
go func() {
time.Sleep(50 * time.Millisecond)
// 需要在 50 毫秒后执行的代码
}()
goroutine 2:
go func() {
select {
case <-time.After(50 * time.Millisecond):
// 需要在 50 毫秒后执行的代码
}
}()
在我看来,第二个 goroutine 的语法非常糟糕。它更难阅读(除非你之前见过并能认出它),而且输入起来也更长。它们之间有区别吗?甚至有必要“记住”第二种暂停执行的方式(goroutine 2)吗?
更多关于Golang中暂停代码执行的各种方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html
7 回复
可以简单地等待第一个被使用,但第二个可以等待其他通道,并使用 case After 作为超时机制。
更多关于Golang中暂停代码执行的各种方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我会选择第一种方式。第二种方式只有在你的 select 语句中还有其他通道接收操作时才有意义,例如执行某个操作并在 50 毫秒后超时。
当然,如果你只使用一个带有 case <-time.After(): 的 case,那实际上是一样的。在这种情况下,你应该使用 time.Sleep()。
这两者是有区别的。第一种情况是休眠(并且完全被阻塞),而第二种情况是等待。你可以添加另一个 case 来等待第二个通道(例如 case <-context.Done():),从而中断这种“休眠”(实际上是等待),或者那个另一个通道可以是操作系统信号处理。
请选择方案二,因为:
- 更容易添加第二种情况来取消等待
- 使用的资源比
time.Sleep少(不过不确定,请了解time.Sleep工作原理的人详细说明) - 语法能更清晰地传达意图;我的看法似乎有违直觉,但这是标准语法(在处理通道和同步时,
time.Sleep在我看来确实很糟糕) - 你更有机会恰好等待 50 毫秒,而不是更久


