我有一个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
。怎么能实现这一目标?
答案 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)
}
}