Как убедиться, что канал Golang ожидает данных и программа не завершает работу, если Stdin не имеет данных

У меня есть программа Golang, которая делает прогнозы в реальном времени для модели машинного обучения, построенной с использованием TensorFlow. Данные для прогнозирования должны считываться построчно из Stdin, и прогноз должен выполняться для каждой строки данных. Поток данных не является постоянным. Мне нужна система, которая гарантирует, что каждый раз, когда есть данные для чтения из Stdin, вызывается метод прогнозирования, и если в Stdin нет данных, программа ожидает новые данные и не завершает работу.

Я пытался добиться этого с помощью каналов и выбора, но если в Stdin нет данных, программа завершается. Ниже приведен фрагмент кода:

  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))
   }
  }

Если в Stdin нет новых данных, должен выполняться случай выбора по умолчанию, а когда в data канал, run_the_model должен быть выполнен. Как этого достичь?

2 ответа

Решение

Положить ваши select в бесконечном цикле.

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

Я думаю, что вы используете выбор неправильно, для вашего случая это должно работать:

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)
    }
}
Другие вопросы по тегам