Sobes.tech
Junior

Miben különböznek a goroutine-ok a szálaktól (thread)?

sobes.tech MI

Válasz az MI-től

A gorutinok a szálaktól (threadek) a következő kulcsfontosságú szempontokban különböznek:

  • Kezelés: A gorutinokat a Go futtatókörnyezete kezeli, míg a szálakat az operációs rendszer. Ez sokkal könnyebbé és gyorsabbá teszi a gorutinok közötti váltást, mivel nem szükséges a kernel kontextusának váltása.
  • Költségek: A gorutinok létrehozása és kezelése sokkal kevesebb erőforrást (memóriát és időt) igényel, mint a szálak. Egy gorutin nagyon kicsi veremmel kezdődik (néhány kilobyte), amely dinamikusan növelhető vagy csökkenthető szükség szerint, míg a szálak fix, gyakran sokkal nagyobb veremmel rendelkeznek.
  • Skálázhatóság: Az alacsony költségek miatt könnyen létrehozhatók százak vagy akár millió gorutin egy alkalmazásban, míg ugyanannyi szál létrehozása gyorsan kimeríti a rendszer erőforrásait.
  • Ütemezés: A Go ütemezője sok gorutint multiplexel kevesebb operációs rendszer szálon. Ez kooperatív multitaskingot valósít meg a gorutinok között egyetlen OS-szálon (bár preemptív elemekkel), míg az OS szálakat az operációs rendszer ütemezője kezeli, amely preemptív multitaskingot használ.
Szempont Gorutinek Szálak (Threadek)
Kezelés Go futtatókörnyezete Operációs rendszer
Költség Alacsony (memória, idő) Magas (memória, idő)
Skálázhatóság Nagyon magas Rendszer erőforrásaitól függően korlátozott
Ütemezés Go ütemező (kooperatív) OS ütemező (preemptív)
Verem Dinamikus, kicsi Fix, gyakran nagy

Gorutina létrehozásának példája:

package main

import (
	"fmt"
	"time"
)

func feladat(id int) {
	fmt.Printf("Gorutina %d kezdődött\n", id)
	time.Sleep(time.Second)
	fmt.Printf("Gorutina %d befejeződött\n", id)
}

func main() {
	go feladat(1) // Gorutina létrehozása
	go feladat(2) // Egy másik gorutina létrehozása

	time.Sleep(2 * time.Second) // Várunk, hogy a gorutinák befejeződjenek
	fmt.Println("Fő gorutina befejeződött")
}