我已经封装了一个队列来实现Writer
和Reader
接口(分别用于推送和弹出(。
我需要不断地监听队列,并处理通过的每一条消息。当队列被表示为通道时,这很简单,但在其他情况下更困难:
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,这是你能做的最好的事情