@Tw1ce

Как выполнить действие через промежуток времени, который может измениться?

Есть общий цикл, обрабатывающий все запросы пользователей, и есть понятие сессии, по истечению которой, должно выполниться действие, предположим (очень близко по смыслу) пользователю должно отправиться уведомление. Сессия закрывается по истечению определенного времени после последнего запроса от пользователя, то есть это отложенное выполнение, но время должно обновляться, так как отсчет должен идти от последнего запроса. У меня есть несколько вариантов, например, функция отложенного выполнения просто завершается, если по времени последнего запроса пользователя понимает, что оно обновилось и где-то еще есть другая функция, которая сделает что требуется, но несколько позже, но, как мне кажется, это далеко не самое изящное решение и существуют более оптимальные способы добиться нужного поведения. Собственно, предложения?
  • Вопрос задан
  • 729 просмотров
Решения вопроса 2
Можно использовать функцию time. AfterFunc для запуска функции после определенного промежутка. Она возвращает таймер. Если произошел еще один запрос, то текущий таймер останавливать с помощью Stop и создавать такой же новый.
Ответ написан
@Tw1ce Автор вопроса
Было решено сделать сессию полноправным объектом (до этого было просто поле с временем последнего действия) с методом Close:
func (s *Session) Close(timeout time.Duration) {

	d := s.LastActionTime.Add(timeout).Sub(time.Now())
	for d > 0 {
		time.Sleep(d)
		d = s.LastActionTime.Add(timeout).Sub(time.Now())
	}
	// Closing the Session
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@ivahaev
Программист, связист и просто хороший человек
В дополнение к решению Алексея, предложу ещё вариант, который применяю лично я для удаления протухших сессий:
Т.к. высокая точность не требуется, то раз в минуту я просто перебираю все сессии, смотрю на время последнего обращения, и если прошло больше установленного времени, то сессию прибиваю. Соответственно, при каждом обращении за сессией, поле LastRequest устанавливается на текущее время.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы