Задать вопрос
@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.
  • Вопрос задан
  • 758 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
uvelichitel
@uvelichitel Куратор тега Go
habrahabr.ru/users/uvelichitel
Вопрос - а зачем тут вообще нужен Ticker?

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

PS. Если смотреть на код в контексте неожиданных конструкций, странно, что вас не заинтересовал код в 132 строке. Я сходу не сообразил, зачем там select.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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