Golang例行程序完成每一项任务

时间:2018-10-11 03:02:06

标签: go goroutine background-task

如何杀死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()
}

1 个答案:

答案 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")
    }
}