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")
}