在select语句中使用Reader接口时的约定

时间:2018-10-28 03:54:51

标签: go select blocking reader

我包装了一个队列,以实现WriterReader接口(分别用于推动和弹出)。

我需要不断地收听队列,并处理所有通过的消息。当将队列表示为通道时,这很简单,否则会更加困难:

loop:
    for {
        var data []byte
        select {
            case <-done:
                break loop
            case _, err := queue.Read(data):
                fmt.Println(string(data))
        }
    }

执行此操作的正确方法是什么? Read处于阻塞状态-等待队列中有消息。

是否有更好,更惯用的方式来实现这一目标?

1 个答案:

答案 0 :(得分:1)

与执行相反操作相比,采用同步API(例如队列。如上所述)要使其异步是很困难的。

这个想法是创建一个新的goroutine(例如,使用go func(){...}),并使该goroutine执行读取并将输出写入通道。

然后第一个goroutine将在该通道上被阻塞,而它已经被阻塞。

如果读取时间太长,这可能会使孤儿资源保留一会儿,但是如果您具有同步API,那是您所能做的最好的事情。