所以我正在尝试实现一个简单监听Redis订阅的go例程(我使用Go-redis库),然后发送消息 收到/处理redis消息后,在一个频道上。
这样的事情:
func foo(redis *redis.Client, comm chan HandlerSignal) {
...
for {
msg, err := pubsub.ReceiveMessage()
sig := HandlerSignal{msg}
comm <- sig
}
}
但是当我阻止并等待redis消息时,我无法找出告诉go例程返回的最佳方法。
有没有人知道这种情况的常见做法,还是我认为这一切都错了?
答案 0 :(得分:2)
正如我在此处所见:https://github.com/go-redis/redis/blob/v3.2.30/pubsub.go#L253 pubsub.ReceiveMessage()
在内部使用ReceiveTimeout(5 * time.Second)
。为什么不使用相同的功能(如@TomaszKłak建议的那样)?
func foo(redis *redis.Client, comm chan HandlerSignal, quit chan struct{}) {
...
for {
select {
case <-quit:
return
default:
msg, err := pubsub.ReceiveTimeout(5 * time.Second)
sig := HandlerSignal{msg}
comm <- sig
}
}
}
由于ReceiveTimeout将在接下来的5秒内阻止例程,因此默认情况不会饱和。