如何保证Golang通道等待数据并且Stdin没有数据时程序不会终止

Vas*_*nti 4 go

我有一个 Golang 程序,它可以对使用 TensorFlow 构建的机器学习模型进行实时预测。预测的数据需要从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))
   }
  }
Run Code Online (Sandbox Code Playgroud)

当Stdin中没有新数据时,必须执行Select的默认情况,当通道中有新数据时datarun_the_model必须执行Select的默认情况。如何才能实现这一目标?

sah*_*haj 5

将您置于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))
   }
}
Run Code Online (Sandbox Code Playgroud)