Голанг подпрограмм каждую минуту - PullRequest
0 голосов
/ 11 октября 2018

Как убить 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 голосов
/ 11 октября 2018

Вы не можете прерывать время. Сон.Используйте 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")
    }
}
...