Goroutines – Concurrencia en Golang

Go language proporciona una función especial conocida como Goroutines. Una Goroutine es una función o método que se ejecuta de forma independiente y simultánea en conexión con cualquier otra Goroutine presente en su programa. O, en otras palabras, cada actividad que se ejecuta simultáneamente en el lenguaje Go se conoce como Goroutines. Puede considerar un Goroutine como un hilo de peso ligero. El costo de crear Goroutines es muy pequeño en comparación con el hilo. Cada programa contiene al menos un solo Goroutine y ese Goroutine se conoce como el Goroutine principal . Todos los Goroutines están trabajando bajo los Goroutines principales si el Goroutine principal terminó, entonces todos los goroutine presentes en el programa también terminaron. Goroutine siempre funciona en segundo plano.

¿Cómo crear una Goroutine?

Puede crear su propio Goroutine simplemente usando la palabra clave go como prefijo de la función o llamada al método, como se muestra en la siguiente sintaxis:

Sintaxis:

func name(){
// statements
}

// using go keyword as the 
// prefix of your function call
go name()

Ejemplo:

// Go program to illustrate
// the concept of Goroutine
package main
  
import "fmt"
  
func display(str string) {
    for w := 0; w < 6; w++ {
        fmt.Println(str)
    }
}
  
func main() {
  
    // Calling Goroutine
    go display("Welcome")
  
    // Calling normal function
    display("GeeksforGeeks")
}

Producción:

GeeksforGeeks
GeeksforGeeks
GeeksforGeeks
GeeksforGeeks
GeeksforGeeks
GeeksforGeeks

En el ejemplo anterior, simplemente creamos una función de visualización() y luego llamamos a esta función de dos maneras diferentes, la primera es una Goroutine, es decir, ir a mostrar («Bienvenido») y la otra es una función normal, es decir, mostrar («GeeksforGeeks» ) . Pero hay un problema, solo muestra el resultado de la función normal que no muestra el resultado de Goroutine porque cuando se ejecuta un nuevo Goroutine, la llamada de Goroutine regresa inmediatamente. El control no espera a que Goroutine complete su ejecución como una función normal, siempre avanza a la siguiente línea después de la llamada de Goroutine e ignora el valor devuelto por Goroutine. Entonces, para ejecutar Goroutine correctamente, hicimos algunos cambios en nuestro programa como se muestra en el siguiente código:

Ejemplo modificado:

// Go program to illustrate the concept of Goroutine
package main
  
import (
    "fmt"
    "time"
)
  
func display(str string) {
    for w := 0; w < 6; w++ {
        time.Sleep(1 * time.Second)
        fmt.Println(str)
    }
}
  
func main() {
  
    // Calling Goroutine
    go display("Welcome")
  
    // Calling normal function
    display("GeeksforGeeks")
}

Producción:

Welcome
GeeksforGeeks
GeeksforGeeks
Welcome
Welcome
GeeksforGeeks
GeeksforGeeks
Welcome
Welcome
GeeksforGeeks
GeeksforGeeks

Agregamos el método Sleep() en nuestro programa que hace que la Goroutine principal duerma durante 1 segundo entre 1 segundo que se ejecuta la nueva Goroutine, muestra » bienvenida » en la pantalla y luego finaliza después de 1 segundo Goroutine principal vuelve a programar y realizar su operación. Este proceso continúa hasta que el valor de z<6 después de eso finaliza la Goroutine principal. Aquí, tanto Goroutine como la función normal funcionan simultáneamente.

Ventajas de Goroutines

  • Las rutinas Gor son más baratas que los hilos.
  • Las rutinas se almacenan en la pila y el tamaño de la pila puede crecer o reducirse según los requisitos del programa. Pero en hilos, el tamaño de la pila es fijo.
  • Goroutines puede comunicarse usando el canal y estos canales están especialmente diseñados para evitar condiciones de carrera al acceder a la memoria compartida usando Goroutines.
  • Supongamos que un programa tiene un subproceso y ese subproceso tiene muchas Goroutines asociadas. Si alguno de los Goroutine bloquea el subproceso debido a la necesidad de recursos, todos los Goroutines restantes se asignarán a un subproceso del sistema operativo recién creado. Todos estos detalles están ocultos a los programadores.

Rutina anónima

En el lenguaje Go, también puede iniciar Goroutine para una función anónima o, en otras palabras, puede crear un Goroutine anónimo simplemente usando la palabra clave go como prefijo de esa función, como se muestra en la siguiente sintaxis:

Sintaxis:

// Anonymous function call
go func (parameter_list){
// statement
}(arguments)

Ejemplo:

// Go program to illustrate how
// to create an anonymous Goroutine
package main
  
import (
    "fmt"
    "time"
)
  
// Main function
func main() {
  
    fmt.Println("Welcome!! to Main function")
  
    // Creating Anonymous Goroutine
    go func() {
  
        fmt.Println("Welcome!! to GeeksforGeeks")
    }()
  
    time.Sleep(1 * time.Second)
    fmt.Println("GoodBye!! to Main function")
}

Producción:

Welcome!! to Main function
Welcome!! to GeeksforGeeks
GoodBye!! to Main function

Publicación traducida automáticamente

Artículo escrito por ankita_saini y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *