新手请教
go语言里,如果读取标准输入的数据,怎么正确处理超时?
启动一个 go routinue 从 os.Stdin 读取数据, 在另外go routinue检测到超时时, 应该怎么处理., 尝试用 os.Stdin.Close() , 读函数 Read() 并没有返回.
如果是TCP,超时关闭连接,读函数会退出.但从标准输入读数据,貌似阻塞在那
谢谢
找到一个类似例子, 之前想到了怎么计算超时,不知道超时时怎么退出正在读数据的goroutine, 因为read一直阻塞.
用通道传递读到的数据,量大量可能会慢,传递一个读到数据的通知就可以计算超时了.
http://www.howtobuildsoftware.com/index.php/how-do/bUGW/go-timeout-for-input-in-terminal-go-application
func getInput(input chan string) {
for {
in := bufio.NewReader(os.Stdin)
result, err := in.ReadString('\n')
if err != nil {
log.Fatal(err)
}
input <- result
}
}
func main() {
input := make(chan string, 1)
go getInput(input)
for {
fmt.Println("input something")
select {
case i := <-input:
fmt.Println("result")
fmt.Println(i)
case <-time.After(4000 * time.Millisecond):
fmt.Println("timed out")
}
}
}
######
现在想来可能思路有问题,一个从STDIN读数据的程序超时了,很可能直接收尾退出了,不在乎那个goroutine能不能自动优雅的退出,反正进程退出,一切都干净了.
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。