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