@yativ_sobb

Где можно использовать горутины в Go?

Я знаю что вопрос немного странный, но я честно не видел где можно использовать gorutine на практике. Все мои задачи связанные с объектом и редко использую массивы или списки, а если использую то там не так много данных и можно обойтись без них.

Я бы хотел узнать в каких интересных задачи вы использовали горутины?
  • Вопрос задан
  • 284 просмотра
Пригласить эксперта
Ответы на вопрос 3
EvgenyMamonov
@EvgenyMamonov Куратор тега Go
Senior software developer, system architect
Самый простой пример - это HTTP сервер.
Когда к вам приходит HTTP запрос - создаётся горутина и каждый запрос спокойно обрабатывается, никто никого не ждёт. Т.е. сервер может обрабатывать параллельно несколько запросов как раз за счёт горутин.

Фактически, почти во всех сетевых сервисах есть смысл использовать горутины для распараллеливания обработки запросов (кроме epoll, kqueue и т.п.)

Еще хороший пример.
Вам нужно сделать парсер Авито :)) или индесатор сайтов.
Т.е. задача сводится к тому, что нужно будет постоянно качать страницы с сайтов.
Если вы будете качать одну страницу за другой - вы будете очень долго качать.
А так вы можете сделать пул из нескольких горутин (как минимум по 1 на поток процессора) и получите параллельное скачивание страниц.

Для ускорения работы вычислений (параллельные вычисления) есть смысл использовать горутины только по 1 на поток процессора). Т.е. в случаях, когда у вас огромный объём данных и нужно максимально ускорить его обработку. Например у вас файл 100Гб, и 8 ядер в процессоре - вы можете разбить файл на 8 частей и параллельно эти части обработать (в самом простом варианте, в реальной жизни нужно будет просто по частям считывать новые данные и скармливать свободной горутине)

Еще когда нужно сделать чтобы какая нибудь задача выполнялась в "фоне".
Например периодическая очистка кеша/устаревший записей в базе.

Реальных примеров намного больше :)
В целом их есть смысл использовать там, где нужно параллельное выполнение какой либо задачи или разных задач параллельно :)
Ответ написан
2ord
@2ord
Задачи у всех разные. Вы работали с потоками? Это похоже на них.

Простой пример:
Есть 2 запроса в БД. Один длится, скажем, 3 секунд, другой 10 секунд. И нет зависимости одного от другого.
Если выполнять их последовательно, это займет 13 секунд. Многовато. Почесав лоб, вы приходите к другому решению:
выполнять 2 запроса одновременно, каждый запрос в горутине! Дождавшись их окончания, пройдет 10 секунд. Экономия!

Другой пример:
Вы работаете с очередями. В одну очередь вы отправляете команды задач, а в другой вы получаете их результаты. Разумеется, и продюсер и консюмер должны работать независимо друг от друга. Как вы запускаете их в Го?
Правильно, двумя горутинами!
Ответ написан
Комментировать
uvelichitel
@uvelichitel Куратор тега Go
habrahabr.ru/users/uvelichitel
В основном для asyncIO, асинхронного ввода/вывода.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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