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