如果情况发生,停止阅读频道的最佳方式

时间:2018-06-07 15:21:20

标签: go

我有一个阻止例程,直到某个频道收到新数据。但是,只要条件为真,我就需要停止go例程。我想知道什么是最好的方式 这样做。

我将用示例代码说明问题。我认为第一个解决方案是使用select语句并不断检查条件,如下所示:

func routine(c chan string, shouldStop func() bool) {
    select {
    case s := <-c:
        doStuff(s)
    default:
        if shouldStop() {
            return
        }
    }
}

但是,这种方法会强制例程每次都调用shouldStop()而不会阻塞。我认为这可能导致性能问题,特别是因为还有很多其他例程正在运行。

另一种选择是使用sleep来至少在shouldStop()调用之间阻塞一点。但是,这不是一个完美的解决方案,因为我想在频道用新数据接收的确切时间内调用doStuff()

最后,我考虑使用第二个频道来实现这一目标,例如:

func routine(c chan string, stop chan bool) {
    select {
    case s := <-c:
        doStuff(s)
    case b := <-stop:
        return
    }
}

虽然我认为这可行,但这会迫使我有一个额外的通道以及shouldStop标志。也许有一个我不知道的更好的解决方案。

任何建议表示赞赏。感谢。

0 个答案:

没有答案