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("Главна горутина је завршена")
}