【发布时间】:2015-09-21 09:40:50
【问题描述】:
假设你有这样的结构:
ch := make(chan string)
errCh := make(chan error)
go func() {
line, _, err := bufio.NewReader(r).ReadLine()
if err != nil {
errCh <- err
} else {
ch <- string(line)
}
}()
select {
case err := <-errCh:
return "", err
case line := <-ch:
return line, nil
case <-time.After(5 * time.Second):
return "", TimeoutError
}
在 5 秒超时的情况下,goroutine 挂起,直到 ReadLine 返回,这可能永远不会发生。我的项目是一个长期运行的服务器,所以我不希望堆积卡住的 goroutine。
【问题讨论】:
-
从变量
r(互联网、磁盘、集群)中读取什么? -
为什么你认为
ReadLine可能永远不会回来?你从哪里读到没有超时程序? -
我正在阅读来自 exec.Command.StdoutPipe() 的
r -
您是否期望 exec 调用中的执行挂起或输出为空?在该 goroutine 中使用 exec.Command.Output() 将收集输出并在 exec.Command 没有执行而不阻塞程序其余部分的情况下引发错误。
-
.Output()运行一个程序并等待它退出,但我不想等待程序退出。主程序正在启动另一个进程。此过程应在准备好后将一行打印到标准输出。