Найти в Дзене

#12 Конкурентная обработка http-запросов

Подобную задачу в разных вариациях любят давать на собеседованиях: Поочередно выполнить http-запросы по предложенному списку урлов. В случае получения http статус кода 200 на запрос печатаем "<url> - ok". В случае получения http статус кода отличного от 200, либо в случае ошибки печатаем "<url> - not ok". Ссылок может быть очень много, поэтому нужно обрабатывать запросы конкурентно. Например, через рассмотренный ранее паттерн fan-out / fan-in. Решение Добавим функцию, которая будет обрабатывать http-запрос и в зависимости от статус кода записывать нужный результат в канал results. В функции main используем анонимную горутину для отправки URL в канал jobs. Это обеспечивает асинхронную отправку URL воркерам. Воркеры обрабатывают задачи из канала jobs и отправляют результаты в канал results. Каждый воркер в бесконечном цикле ждет URL из канала jobs через select и выполняет HTTP-запрос. Воркеры работают до тех пор, пока из канала jobs есть что считывать - это условие для выхода из цикла f

Подобную задачу в разных вариациях любят давать на собеседованиях:

Поочередно выполнить http-запросы по предложенному списку урлов. В случае получения http статус кода 200 на запрос печатаем "<url> - ok". В случае получения http статус кода отличного от 200, либо в случае ошибки печатаем "<url> - not ok".

Ссылок может быть очень много, поэтому нужно обрабатывать запросы конкурентно. Например, через рассмотренный ранее паттерн fan-out / fan-in.

Решение

Добавим функцию, которая будет обрабатывать http-запрос и в зависимости от статус кода записывать нужный результат в канал results.

В функции main используем анонимную горутину для отправки URL в канал jobs. Это обеспечивает асинхронную отправку URL воркерам.

Воркеры обрабатывают задачи из канала jobs и отправляют результаты в канал results. Каждый воркер в бесконечном цикле ждет URL из канала jobs через select и выполняет HTTP-запрос. Воркеры работают до тех пор, пока из канала jobs есть что считывать - это условие для выхода из цикла for.

Благодаря sync.WaitGroup главная горутина ждет завершения всех воркеров перед закрытием канала results.

В конце читаем из канала results и выводим результаты на экран. Цикл будет выполняться до тех пор, пока results не будет закрыт, что произойдет после того, как все воркеры завершат свою работу и горутина wg.Wait() разрешит его закрытие.

-2

На входе было 6 урлов, результаты получились такими:

-3

ссылка на playground

Данную задачу можно решить другими способами, например, через контексты.