我正在使用聊天服务器并使用redigo来发布跨多个Web套接字连接的消息。我有一个go例程(每个用户连接)打开与redis的连接,订阅某些频道并等待消息。等待这条消息 -
msg := psc.Receive()
是一个阻塞操作,因为接收函数之后的任何代码都不会在消息进入之前运行。但是我希望能够查看上下文 -
ctx.Done()
等。这可以通过选择来实现,还是有更惯用的方式来写这个?我试图这样做,因为在当前实现中,此函数作为go例程运行,如果Web会话结束,我想结束redis连接并完成go例程。
func relayRedisMessages (ctx context.Context, ws *websocket.Conn, rc []string) {
c, err := redis.Dial("tcp", "localhost:6379")
if err != nil {
log.Println(err)
return
}
defer c.Close()
psc := redis.PubSubConn{c}
for _, channel := range rc {
psc.Subscribe(channel)
}
for {
msg := psc.Receive()
// Write message to websocket
var msg Message
json.Unmarshal(v.Data, &msg)
err = ws.WriteJSON(msg)
if err != nil {
log.Println(err)
break
}
}
}