我有一个goroutine,它一直被阻止读取stdin,就像这样:
func routine() {
for {
data := make([]byte, 8)
os.Stdin.Read(data);
otherChannel <-data
}
}
例程等待通过stdin读取8个字节并提供另一个通道。
我想优雅地从主线程中停止这个goroutine。但是,由于goroutine几乎总是被stdin阻止读取,我无法找到一个好的解决方案来迫使它停止。我想到了类似的东西:
func routine(stopChannel chan struct{}) {
for {
select {
case <-stopChannel:
return
default:
data := make([]byte, 8)
os.Stdin.Read(data);
otherChannel <-data
}
}
}
然而,问题是如果在stopChannel
关闭时stdin中没有更多输入,goroutine将保持阻塞而不会返回。
是否有一个很好的方法让它在主线程需要时立即返回?
感谢。