Sobes.tech
Junior

Čime se gorutine razlikuju od niti (tredova)?

sobes.tech АИ

Одговор од АИ

Горутине се разликују од нитева (тредова) у следећим кључним аспектима:

  • Управљање: Горутине се управљају од стране окружења за извршавање Го-а, док се нитеви управљају од стране оперативног система. Ово чини прелазак између горатина много лакшим и бржим, јер не захтева промену контекста језгра.
  • Трошкови: Креирање и управљање горатина захтева много мање ресурса (меморије и времена) у поређењу са нитевима. Једна горатина почиње са веома малим стеком (неколико килобајта), који може динамички да расте или смањује по потреби, док нитеви имају фиксни, често много већи стек.
  • Масовност: Захваљујући ниским трошковима, лако је креирати стотине хиљада или чак милионе горатина у једној апликацији, док ће креирање истог броја нитева брзо исцрпети системске ресурсе.
  • Планирање: Планер Го мултиплексира велики број горатина на мањи број нитева ОС-а. Ово реализује кооперативни мултитаскинг између горатина на једном ниту ОС-а (и са елементима предузећа), док нитеви ОС-а управљају планер операционог система који користи предузетни мултитаскинг.
Аспект Горутине Нитеви (тредови)
Управљање Го окружење за извршавање Оперативни систем
Трошкови Ниски (меморија, време) Високи (меморија, време)
Масовност Веома висока Ограничена системским ресурсима
Планирање Планер Го (кооперативни) Планер ОС (принудни)
Стек Динамичан, мали Фиксан, често велики

Пример за креирање горутине:

package main

import (
	"fmt"
	"time"
)

func задатак(ид int) {
	fmt.Printf("Горутина %d почела\n", ид)
	time.Sleep(1 * time.Second)
	fmt.Printf("Горутина %d завршила\n", ид)
}

func main() {
	go задатак(1) // Креирање горутине
	go задатак(2) // Креирање друге горутине

	time.Sleep(2 * time.Second) // Чекамо да се горутине заврше
	fmt.Println("Главна горутина је завршена")
}