Как запустить горутину и в чем ее ключевые особенности?

Ответ

Горутина запускается с помощью ключевого слова go, за которым следует вызов функции.

Горутина — это легковесный поток выполнения (lightweight thread), управляемый средой выполнения (runtime) Go. Все горутины работают в одном адресном пространстве, что делает обмен данными между ними эффективным.

Пример запуска:

import (
    "fmt"
    "time"
    "sync"
)

func sayHello() {
    fmt.Println("Привет из горутины!")
}

func main() {
    go sayHello() // Запуск функции sayHello в новой горутине
    // Если главная горутина (main) завершится, программа остановится,
    // не дожидаясь выполнения других горутин. 
    // Поэтому для демонстрации нужна пауза или синхронизация.
    time.Sleep(100 * time.Millisecond)
}

Ключевые особенности:

  1. Легковесность: Горутины занимают значительно меньше памяти (несколько килобайт), чем системные потоки. Можно легко запустить сотни тысяч горутин.
  2. Управляемость: Управляются Go runtime, а не операционной системой, что снижает накладные расходы на переключение контекста.
  3. Конкурентность vs Параллелизм: Горутины обеспечивают конкурентность (возможность структурировать программу как набор независимо выполняющихся задач). Параллелизм (одновременное выполнение задач на нескольких ядрах CPU) достигается, когда Go runtime распределяет горутины по нескольким системным потокам. По умолчанию GOMAXPROCS равен количеству ядер CPU.
  4. Синхронизация: Для безопасного ожидания завершения горутин в реальных приложениях вместо time.Sleep используются примитивы синхронизации, например, sync.WaitGroup.