Junior
Hoe verschillen goroutines van threads (draadjes)?
sobes.tech AI
Antwoord van AI
Goroutines verschillen van threads (draadjes) in de volgende belangrijke aspecten:
- Beheer: Goroutines worden beheerd door de Go-runtime, terwijl threads door het besturingssysteem worden beheerd. Dit maakt het schakelen tussen goroutines veel lichter en sneller, omdat er geen kernelcontext-switch nodig is.
- Kosten: Het creëren en beheren van goroutines vereist veel minder bronnen (geheugen en tijd) in vergelijking met threads. Een goroutine begint met een zeer kleine stack (enkele kilobytes), die dynamisch kan groeien of krimpen indien nodig, terwijl threads een vaste, vaak veel grotere stack hebben.
- Schaalbaarheid: Dankzij de lage kosten is het gemakkelijk om honderden duizenden of zelfs miljoenen goroutines in één applicatie te creëren, terwijl het creëren van hetzelfde aantal threads snel de systeembronnen uitput.
- Planning: De Go-planner multiplexeert veel goroutines op een kleiner aantal OS-threads. Dit implementeert coöperatief multitasking tussen goroutines op één OS-thread (met elementen van preëmptie), terwijl OS-threads worden beheerd door de OS-planner, die preëmptieve multitasking gebruikt.
| Aspect | Goroutines | Threads |
|---|---|---|
| Beheer | Go-runtime | Besturingssysteem |
| Kosten | Laag (geheugen, tijd) | Hoog (geheugen, tijd) |
| Schaalbaarheid | Zeer hoog | Beperkt door systeembronnen |
| Planning | Go-planner (coöperatief) | OS-planner (preëmptief) |
| Stack | Dynamisch, klein | Vast, vaak groot |
Voorbeeld van het maken van een goroutine:
package main
import (
"fmt"
"time"
)
func taak(id int) {
fmt.Printf("Goroutine %d begonnen\n", id)
time.Sleep(time.Second)
fmt.Printf("Goroutine %d voltooid\n", id)
}
func main() {
go taak(1) // Goroutine maken
go taak(2) // Nog een goroutine maken
time.Sleep(2 * time.Second) // Wachten tot de goroutines klaar zijn
fmt.Println("Hoofdgoroutine beëindigd")
}