¿Cómo se implementa el modelo de trabajo con concurrencia y sincronización en el lenguaje Go?
sobes.tech AI
Respuesta de la IA
En el lenguaje Go, la concurrencia se implementa mediante hilos ligeros llamados goroutines. Las goroutines se inician con la palabra clave go y funcionan en paralelo, mientras que el runtime de Go gestiona su planificación de forma autónoma.
Para sincronizar y compartir datos entre goroutines, se utilizan varios mecanismos:
-
Canales (channels) — permiten transmitir datos de forma segura entre goroutines, asegurando la sincronización. Los canales se pueden considerar colas que bloquean al remitente si están llenos y al receptor si están vacíos.
-
Paquete sync — contiene primitivas de sincronización, como mutexes (
sync.Mutex), variables condicionales (sync.Cond), grupos de espera (sync.WaitGroup) y otros.
Ejemplo de uso de goroutines y canales:
package main
import (
"fmt"
"time"
)
func worker(id int, ch chan string) {
time.Sleep(time.Second)
ch <- fmt.Sprintf("Trabajador %d terminado", id)
}
func main() {
ch := make(chan string)
for i := 1; i <= 3; i++ {
go worker(i, ch)
}
for i := 1; i <= 3; i++ {
msg := <-ch
fmt.Println(msg)
}
}
Aquí, tres goroutines se ejecutan en paralelo, y el canal se usa para recibir los resultados de cada una de ellas.