douhun7609 2016-02-19 16:52
浏览 43
已采纳

如何杀死阻塞去例行

So i'm trying to implement a go routine that simply listens on a Redis subscription (I use the Go-redis library for this) and then sends messages on a channel after it recieves/processes the redis messages.

Something like this:

func foo(redis *redis.Client, comm chan HandlerSignal) {

    ...

    for {
        msg, err := pubsub.ReceiveMessage()
        sig := HandlerSignal{msg}
        comm <- sig
    }
}

But I can't figure out the best way to tell the go routine to return when it is blocking and waiting for a redis message.

Does anyone know the common practice for this kind of situation or am I going about this all wrong?

  • 写回答

1条回答 默认 最新

  • douweibiao8471 2016-02-19 17:20
    关注

    As I can see here: https://github.com/go-redis/redis/blob/v3.2.30/pubsub.go#L253 pubsub.ReceiveMessage() uses internally ReceiveTimeout(5 * time.Second). Why not use the same function (as @Tomasz Kłak suggested)?

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

    Since ReceiveTimeout will block routine for the following 5 seconds, default case will be not saturated.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 孟德尔随机化怎样画共定位分析图
  • ¥18 模拟电路问题解答有偿速度
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址
  • ¥15 elmos524.33 eeprom的读写问题