Go 如何杀掉围棋套路
因此,我尝试实现一个go例程,它只监听Redis订阅(我使用go-Redis库来执行此操作),然后发送消息 在接收/处理redis消息后的通道上 大概是这样的:Go 如何杀掉围棋套路,go,goroutine,Go,Goroutine,因此,我尝试实现一个go例程,它只监听Redis订阅(我使用go-Redis库来执行此操作),然后发送消息 在接收/处理redis消息后的通道上 大概是这样的: func foo(redis *redis.Client, comm chan HandlerSignal) { ... for { msg, err := pubsub.ReceiveMessage() sig := HandlerSignal{msg} comm &
func foo(redis *redis.Client, comm chan HandlerSignal) {
...
for {
msg, err := pubsub.ReceiveMessage()
sig := HandlerSignal{msg}
comm <- sig
}
}
func-foo(redis*redis.Client,comm-chan-HandlerSignal){
...
为了{
msg,err:=pubsub.ReceiveMessage()
sig:=HandlerSignal{msg}
comm正如我在这里看到的:pubsub.ReceiveMessage()
在内部使用ReceiveTimeout(5*time.Second)
。为什么不使用相同的函数(如@Tomasz Kłak所建议的)
func foo(redis*redis.Client,comm chan HandlerSignal,quit chan struct{}){
...
为了{
挑选{
是的,为退出/中止添加另一个频道,然后在for循环中放入一个select,并在该频道上侦听是否有信号打开时返回的频道。与其他Redis客户端一起使用时,您可以通过取消订阅所有频道的客户端来告诉订阅者停止读取。go Redis不支持这一点。另一种方法是,当一个从应用程序接收并发送已识别的sentinel消息。
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
}
}
}