Как убедиться, что канал 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)
}
}