Выполнение кода во время ожидания отмены контекста - PullRequest
0 голосов
/ 03 октября 2019

Допустим, у меня запущено несколько подпрограмм, которые выполняют HTTP-запрос и возвращаются в случайное время. Я запускаю программы (с группами ожидания и одной отменой среди них), и я хочу, чтобы они продолжали выполнять запрос, пока он не вернет OK (может истечь время ожидания). Когда возвращается первый, он вызывает отмену, и все остальные программы должны просто останавливаться.

Я не уверен, как я могу настроить случай функции функции, которая будет выполнять код, если контекст не выполнен?

Например, я знаю, как использовать time.After(), но как мне сделать так, чтобы он выполнял код сразу, а не через какое-то время?

for {
        select {
        case <-ctx.Done():
            wg.Done()
            return
        case <-time.After(time.Second):
            // code goes here
        }
    }

Чем я могу заменитьвремя с?

1 Ответ

0 голосов
/ 03 октября 2019

Если я вас правильно понял, у вас есть несколько гонок на рутину, чтобы вычислить результат по одному и тому же запросу. Я полагаю, вы ищете что-то вроде этого:

for {
  select {
  case <-ctx.Done():
    wg.Done()
    return
  default:
  }
  // Do stuff
}

Выбор будет немедленно сброшен до значения по умолчанию, если контекст не отменен. Тем не менее, контекст может по-прежнему отменяться, пока вы выполняете свой код, так что вы можете столкнуться с множеством подпрограмм, пытающихся записать результат, поэтому вам также нужно синхронизировать это. Вы можете записать свой результат в канал, а при получении вы можете отменить контекст. Однако у вас все еще могут быть программы, ожидающие записи на этот канал, поэтому вы должны продолжать чтение с канала до тех пор, пока все программы не завершатся.

...