Sobes.tech
Junior

Care este diferența dintre goroutines și fire (thread-uri)?

sobes.tech AI

Răspuns de la AI

Gorutinele diferă de fire (fire de execuție) prin următorii aspecte cheie:

  • Gestionare: Gorutinele sunt gestionate de mediul de execuție Go, în timp ce firele sunt gestionate de sistemul de operare. Acest lucru face ca schimbarea între gorutine să fie mult mai ușoară și mai rapidă, deoarece nu necesită schimbarea contextului nucleului.
  • Costuri: Crearea și gestionarea gorutinelelor necesită mult mai puține resurse (memorie și timp) comparativ cu firele. O gorutină începe cu un stivă foarte mică (câțiva kilobyte), care poate crește sau scade dinamic după nevoie, în timp ce firele au o stivă fixă, adesea mult mai mare.
  • Scalabilitate: Datorită costurilor reduse, este ușor să creezi sute de mii sau chiar milioane de gorutine într-o singură aplicație, în timp ce crearea aceluiași număr de fire va epuiza rapid resursele sistemului.
  • Planificare: Planificatorul Go multiplexează un număr mare de gorutine pe un număr mai mic de fire ale sistemului de operare. Aceasta implementează multitasking cooperativ între gorutine pe un singur fir de sistem de operare (cu elemente de preemție), în timp ce firele sistemului de operare sunt gestionate de planificatorul sistemului de operare, care utilizează multitasking preemptiv.
Aspect Gorutine Fire (Thread-uri)
Gestionare Mediul de execuție Go Sistemul de operare
Costuri Scăzute (memorie, timp) Ridicate (memorie, timp)
Scalabilitate Foarte înaltă Limitată de resursele sistemului
Planificare Planificatorul Go (cooperativ) Planificatorul OS (preemptiv)
Stivă Dinamic, mic Fixă, adesea mare

Exemplu de creare a unei gorutine:

package main

import (
	"fmt"
	"time"
)

func sarcina(id int) {
	fmt.Printf("Gorutina %d a început\n", id)
	time.Sleep(time.Second)
	fmt.Printf("Gorutina %d s-a terminat\n", id)
}

func main() {
	go sarcina(1) // Creare gorutină
	go sarcina(2) // Creare altă gorutină

	time.Sleep(2 * time.Second) // Așteptăm ca gorutinele să se termine
	fmt.Println("Gorutina principală s-a terminat")
}