"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 evitar un punto muerto en Go concurrencia con sync.WaitGroup?

¿Cómo evitar un punto muerto en Go concurrencia con sync.WaitGroup?

Publicado el 2024-11-02
Navegar:388

How to Prevent Deadlock in Go Concurrency with sync.WaitGroup?

Resolver el punto muerto de Goroutines

En este escenario, ha encontrado un error de punto muerto en su código de concurrencia de Go. Profundicemos en el problema y brindemos una solución eficiente.

El error se produce debido al desajuste entre el comportamiento de sus productores y consumidores. Sus productores, implementados en la función de productor, envían valores en el canal ch por un tiempo limitado. Sin embargo, el consumidor, presente en su función principal, corre indefinidamente, intentando sin cesar recibir valores del cap.

Para resolver este punto muerto, debe asegurarse de que el consumidor respete la finalización de los productores. Esto significa que el consumidor debe finalizar automáticamente cuando los productores hayan terminado de enviar valores.

Un enfoque eficaz es utilizar un sync.WaitGroup para coordinar a los productores. El grupo de espera te permite seguir el progreso de los productores y esperar a que completen sus tareas antes de cerrar el canal. Aquí tienes una versión mejorada de tu código:

func main() {
    var wg sync.WaitGroup
    ch := make(chan int)

    wg.Add(1)
    go producer(ch, 100*time.Millisecond, 2, &wg)

    wg.Add(1)
    go producer(ch, 200*time.Millisecond, 5, &wg)

    // Start a goroutine to close the channel when all producers are done
    go func() {
        wg.Wait()
        close(ch)
    }()

    // Use a for range loop to receive values from the channel
    for v := range ch {
        fmt.Println(v)
    }
}

En este código actualizado, sync.WaitGroup se utiliza para realizar un seguimiento del número de productores activos. Los productores llaman a wg.Done() para disminuir el grupo de espera cuando terminan de enviar valores. La rutina principal espera a que todos los productores terminen de usar wg.Wait() y luego cierra el canal ch.

Al utilizar un sync.WaitGroup, estableces un mecanismo de coordinación que permite a tu consumidor respetar el estado de finalización. de los productores, resolviendo efectivamente el error de estancamiento.

Ú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