Sobes.tech
Junior

Kuo skiriasi gorutinos nuo sriegių (treadų)?

sobes.tech AI

Atsakymas iš AI

Gorutinės skiriasi nuo srautų (treadų) šiais pagrindiniais aspektais:

  • Valdymas: Gorutinės valdomos Go vykdymo aplinkos, o srautai valdomi operacinės sistemos. Tai daro perėjimą tarp gorutinių daug lengvesnį ir greitesnį, nes nereikia branduolio konteksto keitimo.
  • Išlaidos: Gorutinių kūrimas ir valdymas reikalauja daug mažiau išteklių (atminties ir laiko) nei srautai. Gorutina prasideda labai mažame steke (kelios kilobaitai), kuris gali dinamiškai augti arba mažėti pagal poreikį, o srautai turi fiksuotą, dažnai daug didesnį steką.
  • Mastelio keitimas: Dėl mažų išlaidų, lengva sukurti šimtus tūkstančių ar net milijonus gorutinių viename taikomojoje programoje, tuo tarpu tokio pat skaičiaus srautų kūrimas greitai išnaudoja sistemos išteklius.
  • Planavimas: Go planuotojas daugiausia multiplexina daugybę gorutinių mažesniam skaičiui OS srautų. Tai įgyvendina kooperatyvinį daugiataškumą tarp gorutinių viename sraute (nors ir su išstūmimo elementais), o OS planuotojas valdo srautus, naudodamas išstūmimo daugiataškumą.
Aspektas Gorutinės Srautai (treadai)
Valdymas Go vykdymo aplinka Operacinė sistema
Išlaidos Mažos (atmintis, laikas) Aukštos (atmintis, laikas)
Mastelio keitimas Labai aukštas Apribotas sistemos išteklių
Planavimas Go planuotojas (kooperatyvinis) OS planuotojas (išstūmimo)
Stekas Dinamiškas, mažas Fiksuotas, dažnai didelis

Gorutinės sukūrimo pavyzdys:

package main

import (
	"fmt"
	"time"
)

func task(id int) {
	fmt.Printf("Gorutina %d pradėjo darbą\n", id)
	time.Sleep(time.Second)
	fmt.Printf("Gorutina %d baigė darbą\n", id)
}

func main() {
	go task(1) // Gorutinos sukūrimas
	go task(2) // Kita gorutina

	time.Sleep(2 * time.Second) // Laukiame, kol gorutinos užbaigs darbą
	fmt.Println("Pagrindinė gorutina baigta")
}