Go 如何杀掉围棋套路

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 &

因此,我尝试实现一个go例程,它只监听Redis订阅(我使用go-Redis库来执行此操作),然后发送消息 在接收/处理redis消息后的通道上

大概是这样的:

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    
        }
    }
}