Go 为什么我的程序在添加time.sleep时挂起?

Go 为什么我的程序在添加time.sleep时挂起?,go,Go,我正在尝试对我的程序进行测试,该程序将在设定的时间间隔内保存到磁盘。我的问题是当我在测试中添加时间时。睡眠,无论持续时间如何,程序都会挂起 我的预期行为是允许它睡眠,并且go例程应该在后台运行,并保存到磁盘 下面是作为测试中的goroutine运行的有问题的函数 nodeservice.go func runRegistryBackup(reg *NodeRegistry, interval int, killchan chan bool) { log.SetPrefix("[Registry

我正在尝试对我的程序进行测试,该程序将在设定的时间间隔内保存到磁盘。我的问题是当我在测试中添加时间时。睡眠,无论持续时间如何,程序都会挂起

我的预期行为是允许它睡眠,并且go例程应该在后台运行,并保存到磁盘

下面是作为测试中的goroutine运行的有问题的函数

nodeservice.go

func runRegistryBackup(reg *NodeRegistry, interval int, killchan chan bool) {
log.SetPrefix("[Registry Backup]\t")
log.Printf("Intializing backup every %d seconds", interval)
select {
case <-time.Tick(time.Duration(interval) * time.Second):
    log.Println("Backing up node registry to disk")
    reg.write()
case <-killchan:
    log.Println("Flushing data to disk")
    reg.write()
    defer func() { killchan <- true }()
    //defer close(killchan)
    return
}

如果您能深入了解此问题的原因,我们将不胜感激。

函数
runRegistryBackup
调用
write()
一次,然后退出。然后,主goroutine会阻止发送到
kill

通过向函数中添加循环进行修复。在循环之前创建一次ticker,并在返回时停止ticker

func runRegistryBackup(reg *NodeRegistry, interval int, killchan chan bool) {
    log.SetPrefix("[Registry Backup]\t")
    log.Printf("Intializing backup every %d seconds", interval)
    t := time.NewTicker(time.Duration(interval) * time.Second)
    defer t.Stop()
    for {
        select {
        case <-t.C:
            log.Println("Backing up node registry to disk")
            reg.write()
        case <-killchan:
            log.Println("Flushing data to disk")
            reg.write()
            defer func() { killchan <- true }()
            return
        }
    }
}

go runRegistryBackup(reg,interval,kill)
返回
如果这是解决方案,难以置信我没有注意到这里没有循环。想阻止它,所以你的最高答案为我解决了问题。非常感谢。
[Registry Backup]       2019/07/19 13:29:51 Intializing backup every 5 seconds
[Registry Backup]       2019/07/19 13:29:56 Backing up node registry to disk
func runRegistryBackup(reg *NodeRegistry, interval int, killchan chan bool) {
    log.SetPrefix("[Registry Backup]\t")
    log.Printf("Intializing backup every %d seconds", interval)
    t := time.NewTicker(time.Duration(interval) * time.Second)
    defer t.Stop()
    for {
        select {
        case <-t.C:
            log.Println("Backing up node registry to disk")
            reg.write()
        case <-killchan:
            log.Println("Flushing data to disk")
            reg.write()
            defer func() { killchan <- true }()
            return
        }
    }
}
kill := make(chan bool, 1)
kill := make(chan bool, 1)