diff --git a/examples.txt b/examples.txt index f39c33192..2ef8d4c09 100644 --- a/examples.txt +++ b/examples.txt @@ -32,6 +32,7 @@ Range sobre canales Temporizadores Tickers Pool de trabajadores +Grupos de espera Limitación de transferencia Contadores atómicos Mutexes diff --git a/examples/grupos-de-espera/grupos-de-espera.go b/examples/grupos-de-espera/grupos-de-espera.go new file mode 100644 index 000000000..e4ad10438 --- /dev/null +++ b/examples/grupos-de-espera/grupos-de-espera.go @@ -0,0 +1,42 @@ +// Para esperar a que finalicen varias gorutinas, +// podemos usar un *grupo de espera*. + +package main + +import ( + "fmt" + "sync" + "time" +) + +// Esta es la función que ejecutaremos en cada gorutina. +// Tenga en cuenta que un grupo de espera debe pasarse +// a las funciones mediante un puntero. +func trabajador(id int, wg *sync.WaitGroup) { + // A su regreso, notifique al grupo de espera que hemos terminado. + defer wg.Done() + + fmt.Printf("Trabajador %d comenzando\n", id) + + // Duerme para simular una tarea costosa. + time.Sleep(time.Second) + fmt.Printf("Trabajador %d terminado\n", id) +} + +func main() { + + // Este grupo de espera se utiliza para esperar + // a que finalicen todas las gorutinas lanzadas a continuación. + var wg sync.WaitGroup + + // Inicia varias gorutinas e incremente el contador + // del grupo de espera para cada trabajador. + for i := 1; i <= 5; i++ { + wg.Add(1) + go trabajador(i, &wg) + } + + // Bloquear hasta que el contador del grupo de espera vuelva a 0; + // todos los trabajadores notificaron que terminaron. + wg.Wait() +} diff --git a/examples/grupos-de-espera/grupos-de-espera.sh b/examples/grupos-de-espera/grupos-de-espera.sh new file mode 100644 index 000000000..17a724c79 --- /dev/null +++ b/examples/grupos-de-espera/grupos-de-espera.sh @@ -0,0 +1,14 @@ +$ go run grupos-de-espera.go +Trabajador 5 comenzando +Trabajador 3 comenzando +Trabajador 4 comenzando +Trabajador 1 comenzando +Trabajador 2 comenzando +Trabajador 4 terminado +Trabajador 1 terminado +Trabajador 2 terminado +Trabajador 5 terminado +Trabajador 3 terminado + +# Es probable que el orden de inicio y finalización +# de los trabajadores sea diferente para cada invocación.