gpt4 book ai didi

go - 如何杀死阻塞go routine

转载 作者:IT王子 更新时间:2023-10-29 02:04:41 25 4
gpt4 key购买 nike

所以我正在尝试实现一个简单地监听 Redis 订阅的 go 例程(我为此使用 Go-redis 库)然后发送消息在接收/处理 redis 消息后在 channel 上。

像这样:

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)。为什么不使用相同的功能(如@Tomasz Kł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 秒内阻止例程,因此 default case 不会饱和。

关于go - 如何杀死阻塞go routine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35510557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com