Sobes.tech
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á")
}