[英]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.