Sobes.tech
Junior

In cosa si differenziano le goroutine dai thread?

sobes.tech AI

Risposta dell'AI

Le goroutine differiscono dai thread (fili) nei seguenti aspetti chiave:

  • Gestione: Le goroutine sono gestite dall'ambiente di runtime di Go, mentre i thread sono gestiti dal sistema operativo. Ciò rende il passaggio tra goroutine molto più leggero e veloce, poiché non richiede il cambio di contesto del kernel.
  • Costi: Creare e gestire le goroutine richiede molte meno risorse (memoria e tempo) rispetto ai thread. Una goroutine inizia con uno stack molto piccolo (qualche kilobyte), che può crescere o ridursi dinamicamente secondo necessità, mentre i thread hanno uno stack fisso, spesso molto più grande.
  • Scalabilità: Grazie ai bassi costi, è facile creare centinaia di migliaia o anche milioni di goroutine in un'applicazione, mentre la creazione dello stesso numero di thread esaurirà rapidamente le risorse di sistema.
  • Pianificazione: Il pianificatore di Go multiplexa molte goroutine su un numero inferiore di thread del sistema operativo. Questo implementa il multitasking cooperativo tra goroutine su un singolo thread OS (con elementi di preemption), mentre i thread del sistema operativo sono gestiti dal pianificatore del sistema operativo, che utilizza il multitasking preemptivo.
Aspetto Goroutine Thread (Fili)
Gestione Ambiente di runtime di Go Sistema operativo
Costi Bassi (memoria, tempo) Alti (memoria, tempo)
Scalabilità Molto alta Limitata dalle risorse di sistema
Pianificazione Pianificatore di Go (cooperativo) Pianificatore del sistema operativo (preemptivo)
Stack Dinamico, piccolo Fisso, spesso grande

Esempio di creazione di una goroutine:

package main

import (
	"fmt"
	"time"
)

func compito(id int) {
	fmt.Printf("Goroutine %d ha iniziato\n", id)
	time.Sleep(time.Second)
	fmt.Printf("Goroutine %d ha finito\n", id)
}

func main() {
	go compito(1) // Creazione di una goroutine
	go compito(2) // Creazione di un'altra goroutine

	time.Sleep(2 * time.Second) // Aspettiamo che le goroutine finiscano
	fmt.Println("Goroutine principale terminata")
}