2 votes

Comment s'assurer que le canal Golang attend les données et que le programme ne se termine pas si Stdin ne contient pas de données.

J'ai un programme Golang qui fait des prédictions en temps réel sur un modèle d'apprentissage automatique construit avec TensorFlow. Les données pour la prédiction doivent être lues ligne par ligne depuis Stdin et la prédiction doit être effectuée sur chaque ligne de données. Le flux de données n'est pas constant. J'ai besoin d'un système qui garantit que chaque fois qu'il y a des données à lire à partir de Stdin, la méthode de prédiction est invoquée et s'il n'y a pas de données dans Stdin, le programme attend de nouvelles données et ne se termine pas.

J'ai essayé d'y parvenir en utilisant les canaux et le select, mais s'il n'y a pas de données dans le Stdin, le programme se termine. Voici l'extrait de code :

  func run_the_model(in <-chan string) {
     go func(){
        ...  
        ...  
        ...
         //Fetch the model
         //Run the prediction 
         //print the result on StdOut
     }() 
  }

  func main() {
   data := make(chan string)
   // read data from Stdin
   go func() {
       scan := bufio.NewScanner(os.Stdin)
       for scan.Scan() {
           data <- scan.Text()
       }

   }()
   time.Sleep(time.Second * 5)

   select{
      case <-data:
        run_the_model(data)
        time.Sleep(time.Second * 5)
      default:
        println("Waiting for data")
        time.Sleep(time.Duration(math.MaxInt64))
   }
  }

Lorsqu'il n'y a pas de nouvelles données dans Stdin, le cas par défaut de Select doit être exécuté et lorsqu'il y a de nouvelles données dans le fichier data le canal run_the_model doit être exécuté. Comment y parvenir ?

2voto

sahaj Points 675

Mettez votre select en boucle infinie.

for {
   select{
      case <-data:
        run_the_model(data)
        time.Sleep(time.Second * 5)
      default:
        println("Waiting for data")
        time.Sleep(time.Duration(math.MaxInt64))
   }
}

0voto

Jeyem Points 117

Je pense que vous utilisez mal la fonction select, pour votre cas, cela devrait fonctionner :

func runTheModel(in string) {
    // do what ever u want
}

func main() {
    data := make(chan string)
    // read data from Stdin
    go func() {
        scan := bufio.NewScanner(os.Stdin)
        for scan.Scan() {
            data <- scan.Text()
        }

    }()
    println("waiting for data:")
    for d := range data {
        // command to exit program
        if d == "q" {
            return
        }
        go runTheModel(d)
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X