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