Junior
Čo je rozdiel medzi gorutinami a vláknami (vlákna)?
sobes.tech AI
Odpoveď od AI
Gorutiny sa líšia od vlákien (treadov) nasledujúcimi kľúčovými aspektmi:
- Správa: Gorutiny sú spravované prostredím vykonávania Go, zatiaľ čo vlákna sú spravované operačným systémom. To robí prechod medzi gorutinami oveľa ľahším a rýchlejším, pretože nevyžaduje prechod kontextu jadra.
- Náklady: Vytváranie a správa gorútin vyžaduje oveľa menej zdrojov (pamäti a času) v porovnaní s vláknami. Gorutina začína s veľmi malým zásobníkom (niekoľko kilobajtov), ktorý sa môže dynamicky zväčšovať alebo zmenšovať podľa potreby, zatiaľ čo vlákna majú pevný, často oveľa väčší zásobník.
- Škálovateľnosť: Vďaka nízkym nákladom je možné ľahko vytvoriť státisíce alebo dokonca milióny gorútin v jednej aplikácii, zatiaľ čo vytvorenie rovnakého počtu vlákien rýchlo vyčerpá systémové zdroje.
- Plánovanie: Plánovač Go multiplexuje veľké množstvo gorútin na menší počet vlákien OS. To implementuje kooperatívnu multitasking medzi gorutinami na jednom vlákne OS (aj s prvkami pretláčania), zatiaľ čo vlákna OS sú spravované plánovačom operačného systému, ktorý používa pretláčajúcu multitasking.
| Aspekt | Gorutiny | Vlákna (Tready) |
|---|---|---|
| Správa | Prostredie vykonávania Go | Operačný systém |
| Náklady | Nízke (pamäť, čas) | Vysoké (pamäť, čas) |
| Škálovateľnosť | Veľmi vysoká | Obmedzená systémovými zdrojmi |
| Plánovanie | Plánovač Go (kooperatívne) | Plánovač OS (pretláčanie) |
| Zásobník | Dynamický, malý | Pevný, často veľký |
Príklad vytvorenia gorutiny:
package main
import (
"fmt"
"time"
)
func task(id int) {
fmt.Printf("Gorutina %d začala pracovať\n", id)
time.Sleep(time.Second)
fmt.Printf("Gorutina %d ukončila prácu\n", id)
}
func main() {
go task(1) // Vytvorenie gorutiny
go task(2) // Vytvorenie ďalšej gorutiny
time.Sleep(2 * time.Second) // Čakáme, aby gorutiny mohli dokončiť
fmt.Println("Hlavná gorutina ukončená")
}