"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo lograr un verdadero paralelismo en Golang: rutinas, puntos muertos y canales?

¿Cómo lograr un verdadero paralelismo en Golang: rutinas, puntos muertos y canales?

Publicado el 2024-11-09
Navegar:968

How to Achieve True Parallelism in Golang: Goroutines, Deadlocks, and Channels?

Procesamiento paralelo en Golang: aprovechar la concurrencia para el rendimiento

Considere el código proporcionado, que muestra el procesamiento paralelo con gorutinas. Sin embargo, plantea dudas sobre el potencial de ejecución simultánea y el enfoque óptimo para lograr el paralelismo.

Ejecución concurrente de dowork

La premisa de que dowork se ejecutará en paralelo es no garantizado. Si bien las gorutinas proporcionan un mecanismo de concurrencia liviano, el programador del sistema operativo determina la secuencia de ejecución real. GOMAXPROCS, según las notas de la versión de Go 1.5, normalmente se alinea con los núcleos disponibles.

Enfoque sugerido: prevención de interbloqueos y control de concurrencia

Con respecto al mantenimiento de la ejecución de la función principal , fmt.Scanln puede no ser confiable, especialmente en entornos de producción. En su lugar, considere implementar un sync.WaitGroup para garantizar que todas las rutinas se completen antes de salir. Además, para mejorar el control de la concurrencia y garantizar la utilización adecuada de los recursos para tareas paralelas, se recomienda utilizar canales de trabajo dowork separados para cada rutina.

Función de utilidad para la ejecución de funciones paralelas

Para simplificar la ejecución de funciones paralelas, se puede aprovechar una función de utilidad existente como la siguiente:

import "sync"

// Parallelize parallelizes function calls
func Parallelize(functions ...func()) {
    var waitGroup sync.WaitGroup
    waitGroup.Add(len(functions))

    defer waitGroup.Wait()

    for _, function := range functions {
        go func(f func()) {
            defer waitGroup.Done()
            f()
        }(function)
    }
}

Aplicando esta función al fragmento de código:

func1 := func() { f(0) }
func2 := func() { f(1) }
func3 := func() { f(2) }

Parallelize(func1, func2, func3)
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3