登录
首页 >  Golang >  Go问答

为什么计时器 Stop 会出现死锁错误?

来源:stackoverflow

时间:2024-05-01 12:48:38 181浏览 收藏

哈喽!今天心血来潮给大家带来了《为什么计时器 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 会出现死锁错误?》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>