es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Hay otra forma de hacer que WaitGroup muestre el proceso?

Este es mi “Snippet Code” para ejecutar todo el trabajador

Lenguaje GO
for w := 1; w <= *totalworker; w++ {
        wg.Add(1)
        go worker(w, jobs, results, dir, &wg)
    }

Este es mi “Worker“:

Lenguaje Go
func worker(id int, jobs <-chan [][]string, results chan<- [][]string, dir *string, wg *sync.WaitGroup) {
    defer wg.Done()
    for j := range jobs {
        filename := j[0][4] + ".csv"
        fmt.Printf("\nTrabajador %d comenzando un trabajo\n", id)
        //results <- j //para mostrar el resultado de los trabajos, innecesario
        fmt.Printf("\nTrabajador %d Creando %s.csv\n", id, j[0][4])
        CreateFile(dir, &filename, j)
        fmt.Printf("\nTrabajador %d Terminó de crear %s.csv en %s\n", id, j[0][4], *dir)
        fmt.Printf("\nTrabajador %d terminó un trabajo\n", id)
    }
}

Cuando lo ejecuto sin WaitGroup, solo crea algunos de los archivos que necesito. Pero muestra el proceso. Muestra que el trabajador 1 hace un trabajo, el trabajador 2 hace un trabajo, etc. Por lo tanto, hasta el final del programa, mostrará cada uno de ellos.

Por otro lado, con WaitGroup, crea todos los archivos que necesito. Pero los crea todos de una vez sin mostrar el proceso. Cuando lo ejecuto con WaitGroup, simplemente termina como … espera, ¿dónde está todo el proceso xD? Termina mostrando que el trabajador 1 hace un trabajo, el trabajador 2 hace un trabajo, etc. al final del programa.

¿Hay algo que pueda hacer con este WaitGroup para que muestre cada una de sus impresiones?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como el propósito de sync.WaitGroup es esperar a que un grupo de goroutines termine su ejecución, no está diseñado para mostrar el progreso de cada goroutine. Sin embargo, puedes usar impresiones o registros adicionales dentro de la función worker para mostrar el progreso de cada trabajador. Alternativamente, puedes utilizar un canal de tipo buffer para enviar el estado de progreso desde el trabajador a la función principal y luego imprimirlo desde allí. Sin embargo, debes tener en cuenta las implicaciones de rendimiento de enviar actualizaciones frecuentes a través de un canal.

Comments are closed.