如何杀死阻塞程序

时间:2016-02-19 16:52:56

标签: go goroutine

所以我正在尝试实现一个简单监听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例程返回的最佳方法。

有没有人知道这种情况的常见做法,还是我认为这一切都错了?

1 个答案:

答案 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秒内阻止例程,因此默认情况不会饱和。