【发布时间】:2016-02-20 01:20:02
【问题描述】:
所以我正在尝试实现一个简单地监听 Redis 订阅的 go 例程(我为此使用 Go-redis 库)然后发送消息 在接收/处理 redis 消息后在通道上。
类似这样的:
func foo(redis *redis.Client, comm chan HandlerSignal) {
...
for {
msg, err := pubsub.ReceiveMessage()
sig := HandlerSignal{msg}
comm <- sig
}
}
但我想不出告诉 goroutine 在阻塞和等待 redis 消息时返回的最佳方法。
有谁知道这种情况的常见做法,还是我做错了?
【问题讨论】:
-
是的,为退出/中止添加另一个通道,然后在 for 循环中添加一个选择,并在该通道发出信号时监听返回。
-
对于其他 Redis 客户端,您可以通过取消订阅所有频道的客户端来告诉订阅者停止阅读。 go-redis 不支持这个。另一种方法是在收到可区分的哨兵消息时中断循环并从应用程序发送该消息。