簡體   English   中英

如何殺死阻塞去例行

[英]How to kill blocking go routine

因此,我正在嘗試實現一個go例程,該例程僅偵聽Redis訂閱(為此我使用Go-redis庫),然后在接收/處理redis消息后在通道上發送消息。

像這樣:

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

    ...

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

但是我無法弄清楚告訴go例程阻塞和等待redis消息時返回的最佳方法。

有人知道這種情況的普遍做法嗎,或者我將這一切弄錯了嗎?

正如我在這里看到的那樣: 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秒鍾內阻止例程,因此默認情況不會飽和。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM