当前位置: > > > > 为什么计时器 Stop 会出现死锁错误?
来源:stackoverflow
2024-05-01 12:48:38
0浏览
收藏
哈喽!今天心血来潮给大家带来了《为什么计时器 Stop 会出现死锁错误?》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang,千万别错过这篇文章~希望能帮助到你!
问题内容
我正在创建这个函数来测试创建和停止计时器。运行时出现死锁错误:
package main import "fmt" import "time" func main() { livenesstimer := &time.timer{} livenessinterval, _ := time.parseduration("1m") for { fmt.print("timer started") livenesstimer = time.newtimer(livenessinterval) select { case <-livenesstimer.c: fmt.print(time.now()) fmt.println("timer triggered") } if !livenesstimer.stop() { // drain timer from channel if any fmt.println("drain timer") <-livenesstimer.c } } }
当我运行此代码时,出现此错误:
Timer started2009-11-10 23:01:00 +0000 UTC m=+60.000000001timer triggered drain timer fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan receive]: main.main() /tmp/sandbox748850751/prog.go:21 +0x2e0
stop
的文档建议检查返回值并排空通道。
解决方案
这是文档中的关键部分:
…假设程序尚未收到来自 t.C 的信息
在您的情况下,计时器已经触发,Stop
返回 false,并且您开始等待没有其他 goroutine 运行的通道,因此死锁。
以上就是《为什么计时器 Stop 会出现死锁错误?》的详细内容,更多关于的资料请关注公众号!