如何确保Golang通道等待数据,如果Stdin没有数据,程序不会终止

时间:2017-10-31 19:18:05

标签: go

我有一个Golang程序,可以对使用TensorFlow构建的机器学习模型进行实时预测。需要从Stdin逐行读取预测数据,并且必须对每行数据执行预测。数据流不是恒定的。我需要一个系统来确保每次从Stdin读取数据时,都会调用预测方法,如果Stdin中没有数据,程序将等待新数据并且不会终止。

我尝试使用channel和select实现此功能,但如果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中没有新数据时,必须执行Select的默认情况,当data频道中有新数据时,必须执行run_the_model。怎么能实现这一目标?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我认为你使用选择错误,对于你的情况,这应该是有效的:

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