Les goroutines són una característica fonamental de Go que permet l'execució concurrent de funcions. Són lleugeres i gestionades pel runtime de Go, el que les fa molt eficients en termes de recursos. En aquesta secció, aprendrem què són les goroutines, com crear-les i com gestionar la concurrència en Go.
Què és una Goroutine?
Una goroutine és una funció que s'executa de manera concurrent amb altres goroutines en el mateix espai d'adreces. Les goroutines són molt més lleugeres que els fils del sistema operatiu, ja que el runtime de Go gestiona la seva execució.
Creació d'una Goroutine
Per crear una goroutine, simplement afegim la paraula clau go
abans de la crida a la funció. Aquí teniu un exemple senzill:
package main import ( "fmt" "time" ) func sayHello() { fmt.Println("Hola, món!") } func main() { go sayHello() time.Sleep(1 * time.Second) // Espera per assegurar-se que la goroutine s'executi }
Explicació del Codi
- Funció
sayHello
: Aquesta funció simplement imprimeix "Hola, món!". - Paraula clau
go
: En elmain
, cridemgo sayHello()
, el que fa quesayHello
s'executi com una goroutine. time.Sleep
: Utilitzemtime.Sleep
per esperar un segon, assegurant-nos que la goroutine tingui temps d'executar-se abans que el programa acabi.
Sincronització de Goroutines
Quan treballem amb goroutines, és important gestionar la sincronització per evitar condicions de carrera i altres problemes de concurrència. Go proporciona diversos mecanismes per a això, com ara canals i el paquet sync
.
Exemple amb Canals
Els canals són una manera segura de comunicar-se entre goroutines. Aquí teniu un exemple:
package main import ( "fmt" ) func sayHello(done chan bool) { fmt.Println("Hola, món!") done <- true } func main() { done := make(chan bool) go sayHello(done) <-done // Espera fins que la goroutine enviï un valor }
Explicació del Codi
- Canal
done
: Creem un canaldone
de tipusbool
. - Passar el canal: Passem el canal
done
a la funciósayHello
. - Enviar valor al canal: Després d'imprimir "Hola, món!", la goroutine envia
true
al canaldone
. - Esperar valor del canal: En el
main
, esperem fins que la goroutine enviï un valor al canaldone
.
Exercicis Pràctics
Exercici 1: Crear una Goroutine
Escriu un programa que creï una goroutine per imprimir els números de l'1 al 5. Utilitza time.Sleep
per assegurar-te que la goroutine tingui temps d'executar-se.
package main import ( "fmt" "time" ) func printNumbers() { for i := 1; i <= 5; i++ { fmt.Println(i) } } func main() { go printNumbers() time.Sleep(1 * time.Second) }
Exercici 2: Sincronització amb Canals
Modifica l'exercici anterior per utilitzar un canal per sincronitzar la goroutine amb la funció main
.
package main import ( "fmt" ) func printNumbers(done chan bool) { for i := 1; i <= 5; i++ { fmt.Println(i) } done <- true } func main() { done := make(chan bool) go printNumbers(done) <-done }
Errors Comuns i Consells
- No esperar la goroutine: Si no esperes que la goroutine acabi, el programa pot finalitzar abans que la goroutine tingui temps d'executar-se.
- Condicions de carrera: Assegura't de sincronitzar correctament les goroutines per evitar condicions de carrera.
- Bloqueig de canals: Si una goroutine espera indefinidament en un canal, pot causar un bloqueig. Assegura't que tots els canals siguin llegits i escrits correctament.
Resum
En aquesta secció, hem après què són les goroutines, com crear-les i com gestionar la concurrència en Go utilitzant canals. Les goroutines són una eina poderosa per escriure programes concurrents i eficients en Go. En la següent secció, explorarem els canals en més detall per comunicar-nos entre goroutines de manera segura i eficient.
Curs de Programació en Go
Mòdul 1: Introducció a Go
- Introducció a Go
- Configuració de l'Entorn Go
- El Teu Primer Programa en Go
- Sintaxi i Estructura Bàsiques
Mòdul 2: Conceptes Bàsics
Mòdul 3: Estructures de Dades Avançades
Mòdul 4: Gestió d'Errors
Mòdul 5: Concurrència
Mòdul 6: Temes Avançats
Mòdul 7: Desenvolupament Web amb Go
Mòdul 8: Treballant amb Bases de Dades
Mòdul 9: Desplegament i Manteniment
- Construcció i Desplegament d'Aplicacions Go
- Registre
- Monitorització i Optimització del Rendiment
- Millors Pràctiques de Seguretat