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

  1. Funció sayHello: Aquesta funció simplement imprimeix "Hola, món!".
  2. Paraula clau go: En el main, cridem go sayHello(), el que fa que sayHello s'executi com una goroutine.
  3. time.Sleep: Utilitzem time.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

  1. Canal done: Creem un canal done de tipus bool.
  2. Passar el canal: Passem el canal done a la funció sayHello.
  3. Enviar valor al canal: Després d'imprimir "Hola, món!", la goroutine envia true al canal done.
  4. Esperar valor del canal: En el main, esperem fins que la goroutine enviï un valor al canal done.

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

  1. No esperar la goroutine: Si no esperes que la goroutine acabi, el programa pot finalitzar abans que la goroutine tingui temps d'executar-se.
  2. Condicions de carrera: Assegura't de sincronitzar correctament les goroutines per evitar condicions de carrera.
  3. 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.

© Copyright 2024. Tots els drets reservats