如何杀死time.Sleep(time.Until(nextExecute))吗?
这是一个旧的会话清理任务,需要每分钟执行一次作为后台任务。工作正常,但在SIGINT之后,所有程序仍在等待时间。睡眠...知道如何消磨时间。睡眠或替代例行代码?
func SessionCleanupTask() {
var quit = make(chan os.Signal)
signal.Notify(quit, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) // kbdloss,ctrl+c,terminate,quit
for {
select {
case <- quit:
return
default:
nextExecute := time.Now().Add(time.Minute)
time.Sleep(time.Until(nextExecute))
log.Println("peek: SessionCleanupTask")
}
}
}
func init() {
go SessionCleanupTask()
}
答案 0 :(得分:1)
您不能中断时间。睡眠。在选择语句中使用time.After而不是默认情况。
此外,您还必须缓冲os.Signal通道,否则,如果在执行“ SessionCleanupTask”时到达信号,则会错过该信号;通知不等待接收者:
打包信号将不会阻止发送到c:调用方必须确保c具有足够的缓冲区空间以跟上预期的信号速率。对于仅用于通知一个信号值的通道,大小为1的缓冲区就足够了。
quit := make(chan os.Signal, 1) // buffered
signal.Notify(quit, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
for {
select {
case <-quit:
return
case <-time.After(time.Minute):
log.Println("peek: SessionCleanupTask")
}
}