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.

Utilizando goroutines para iterar infinitamente a través de un archivo.

Soy un traductor de español que traduce documentos de IT. Traduzca lo siguiente al español. No traduzca el código ni la salida en markdown.

Soy nuevo en Go, así que por favor disculpen mi ignorancia. Estoy intentando iterar a través de un montón de listas de palabras línea por línea indefinidamente con goroutines. Pero al intentar hacerlo, no itera o se detiene a medio camino. ¿Cómo puedo hacer esto de manera adecuada sin interrumpir el flujo?

package main

import (
    "bufio"
    "fmt"
    "os"
)

var file, _ = os.Open("wordlist.txt")

func start() {
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        fmt.Println(scanner.Text())
    }
}

func main() {
    for t := 0; t < 150; t++ {
        go start()
        fmt.Scanln()
    }
}

¡Gracias!
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    En primer lugar, ¡es genial que estés explorando Go! En cuanto a tu pregunta, hay algunas sugerencias que puedo hacer para mejorar tu código:

    1. Usa un grupo de espera: Tal como está, tu función principal no espera a que las goroutines terminen antes de finalizar, lo que podría explicar por qué tu programa se detiene a mitad de camino. Puedes usar el paquete sync.WaitGroup para asegurarte de que todas las goroutines terminen su trabajo antes de que la rutina principal salga. Aquí tienes un ejemplo:
    import (
        "sync"
    )
    
    func main() {
        var wg sync.WaitGroup
    
        for i := 0; i < 150; i++ {
            wg.Add(1)
            go func() {
                defer wg.Done()
                scanner := bufio.NewScanner(file)
                for scanner.Scan() {
                    fmt.Println(scanner.Text())
                }
            }()
        }
    
        wg.Wait()
    }
    

    Aquí creamos un grupo de espera y agregamos 1 por cada goroutine que creamos. Cada goroutine luego disminuye el grupo de espera cuando termina su trabajo, usando defer. Finalmente, la llamada wg.Wait() bloquea hasta que todas las goroutines hayan terminado.

    1. Cierra el archivo: Debes cerrar el archivo cuando hayas terminado de usarlo para evitar fugas de recursos. También puedes usar defer para esto, así:
    func start() {
        scanner := bufio.NewScanner(file)
        for scanner.Scan() {
            fmt.Println(scanner.Text())
        }
    }
    
    func main() {
        defer file.Close() // cierra el archivo cuando main() finalice
    
        // ...
    }
    

    Esto cerrará el archivo después de que todas las goroutines hayan terminado, asegurando que no tengas problemas al usarlo más tarde.

    Espero que estas sugerencias te sean útiles, ¡y no dudes en preguntar si tienes alguna otra pregunta!

Comments are closed.