#4.3 golang goroutine Горутина - что это такое

Горутины (goroutines) — это легковесные потоки выполнения в языке Go, управляемые планировщиком среды выполнения (runtime), а не операционной системой.

Горутины позволяют запускать функции конкурентно (асинхронно), потребляя очень мало памяти - всего около 2 КБ, что позволяет создавать их в тысячах экземпляров

Главная горутина

Каждая программа на Go имеет главную горутину, которая автоматически создается при запуске функции main()

  • Любая горутина завершается, когда завершается её функция - у главной горутины это функция main().
  • Когда главная горутина завершается, завершается вся программа, а вместе с ней и все остальные (фоновые) горутины - даже те, которые не успели закончить свою работу: Go не станет их дожидаться.

Поэтому если программа запускает фоновые горутины, важно позаботиться о том, чтобы главная не завершилась раньше дочерних - как именно это делается, разберём в уроках про многопоточность.

Зачем нужны горутины

Программам часто приходится чего-то ждать: ответа от сервера, чтения файла с диска, завершения долгого вычисления. Если все действия выполнять строго по очереди, программа будет простаивать на каждом ожидании.

Горутины позволяют не ждать: пока одна часть программы ждёт или считает, остальные могут работать в это же время. Это похоже на несколько касс в магазине: покупатели не стоят в одну общую очередь, а обслуживаются параллельно, каждая у своей кассы.

Благодаря тому, что горутины "легковесные" (что это значит - ниже), их можно запускать много: например, сервер может одновременно обрабатывать тысячи запросов, выделяя по горутине на каждый.

Отличие от обычного вызова функции

Обычный вызов функции - последовательный: программа дожидается, пока функция завершится, и только потом идёт дальше. Запуск той же функции как горутины означает "запустили и пошли дальше": горутина работает сама по себе, а остальная программа не стоит на месте:

sayHello()     // обычный вызов: программа дождётся завершения функции
go sayHello()  // запуск горутины: программа сразу перейдёт к следующим строкам

-- ключевое слово go как раз и означает "запусти функцию параллельно". Как это выглядит на практике, с примерами и подводными камнями, разберём далее по курсу в уроках про многопоточность далее.

Чем горутины отличаются от потоков операционной системы

"Легковесность" горутин проще всего понять в сравнении с обычными потоками (threads), которые создаёт операционная система:

  • поток ОС требует заметных ресурсов: только под стек выделяется порядка мегабайта памяти, а горутине на старте хватает около 2 КБ;
  • создание потока - относительно дорогая операция, горутины же создаются быстро и в больших количествах;
  • горутинами управляет не операционная система, а планировщик самого Go (часть среды выполнения - runtime), который распределяет множество горутин по небольшому числу системных потоков.

Отсюда и название "легковесные потоки": для программиста горутина ведёт себя как отдельный поток выполнения, но стоит гораздо дешевле.

Key Words for FKN + antitotal forum (CS VSU):