Задать вопрос
@lazy_val

Зачем for {select} оборачивать в еще один select с time.Ticker?

Вот такой простой на виду код из prometheus/scrape:

for {
		select {
		case <-m.graceShut:
			return
		case <-ticker.C:
			select {
			case <-m.triggerReload:
				m.reload()
			case <-m.graceShut:
				return
			}
		}
	}

Вроде все понятно: ждем периодического сигнала от time.Ticker, после получения такого сигнала ждем сигнала на перезагрузку (triggerReload). Вопрос - а зачем тут вообще нужен Ticker? Почему просто не вложить в for один единственный select:
for {
		select {
		case <-m.triggerReload:
			m.reload()
		case <-m.graceShut:
			return
		}
	}


И в том и в другом случае код будет ждать сигнала. Только в первом сначала из time.Ticker, потом из triggerReload. А вот втором - сразу из triggerReload.
  • Вопрос задан
  • 743 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
uvelichitel
@uvelichitel Куратор тега Go
habrahabr.ru/users/uvelichitel
Вопрос - а зачем тут вообще нужен Ticker?

Может быть против "дребезга контактов") На случай если ввиду каких либо причин сигналы m.triggerReload начнут сыпаться как из ведра (с оглушительной частотой)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@starwalkn
meme engineer
Выглядит так, что это сделано для того, чтобы при падении в кейс <-ticker.C можно было отловить сигнал на shutdown и не делать reload. Для ситуаций, когда этот сигнал приходит в момент проваилвания в кейс тикера.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы