停止正常阻止的goroutine

时间:2018-06-09 16:10:08

标签: go

我有一个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将保持阻塞而不会返回。

是否有一个很好的方法让它在主线程需要时立即返回?

感谢。

0 个答案:

没有答案