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



我已经封装了一个队列来实现WriterReader接口(分别用于推送和弹出(。

我需要不断地监听队列,并处理通过的每一条消息。当队列被表示为通道时,这很简单,但在其他情况下更困难:

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

做这件事的正确方法是什么?这里的Read是阻塞的——它会等待,直到队列有消息为止。

有没有更好、更地道的方法来实现这一点?

采用同步API(如上文所述的queue.Read(并使其异步比采用相反的方法更困难。

其想法是创建一个新的goroutine(例如使用go func(({…}(,并让该goroutine执行对通道的读写输出。

然后第一个goroutine将阻塞该通道和它已经阻塞的通道

如果读取需要很长时间,这可能会在一段时间内留下孤立的资源,但如果你有一个同步的API,这是你能做的最好的事情

相关内容

  • 没有找到相关文章

最新更新