开发者社区> 问答> 正文

go语言里,如果读取标准输入的数据,怎么正确处理超时:报错

新手请教

go语言里,如果读取标准输入的数据,怎么正确处理超时?

启动一个 go routinue 从 os.Stdin 读取数据, 在另外go routinue检测到超时时, 应该怎么处理., 尝试用 os.Stdin.Close() , 读函数 Read() 并没有返回.

如果是TCP,超时关闭连接,读函数会退出.但从标准输入读数据,貌似阻塞在那

谢谢

展开
收起
kun坤 2020-06-06 15:17:18 952 0
1 条回答
写回答
取消 提交回答
  • 找到一个类似例子, 之前想到了怎么计算超时,不知道超时时怎么退出正在读数据的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能不能自动优雅的退出,反正进程退出,一切都干净了.

    2020-06-06 15:17:24
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Go语言路上踩过的坑 立即下载
gohbase :HBase go客户端 立即下载
Go构建日请求千亿级微服务实践 立即下载