我有一个 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的默认情况,当通道中有新数据时data
,run_the_model
必须执行Select的默认情况。如何才能实现这一目标?
将您置于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)