我包装了一个队列,以实现Writer
和Reader
接口(分别用于推动和弹出)。
我需要不断地收听队列,并处理所有通过的消息。当将队列表示为通道时,这很简单,否则会更加困难:
loop:
for {
var data []byte
select {
case <-done:
break loop
case _, err := queue.Read(data):
fmt.Println(string(data))
}
}
执行此操作的正确方法是什么? Read
处于阻塞状态-等待队列中有消息。
是否有更好,更惯用的方式来实现这一目标?
答案 0 :(得分:1)
与执行相反操作相比,采用同步API(例如队列。如上所述)要使其异步是很困难的。
这个想法是创建一个新的goroutine(例如,使用go func(){...}),并使该goroutine执行读取并将输出写入通道。
然后第一个goroutine将在该通道上被阻塞,而它已经被阻塞。
如果读取时间太长,这可能会使孤儿资源保留一会儿,但是如果您具有同步API,那是您所能做的最好的事情。