【发布时间】:2016-11-05 15:44:57
【问题描述】:
我正在尝试弄清楚如何将 RethinkDB changefeeds 与 golang 一起使用。
我的具体问题是如何停止一个监听更改的 goroutine
数据库。例如,参见下面的函数getData()。我从处理程序运行它
通过调用go getData(c) 来运行。每当数据库更新时,记录是
传递给通道c,然后传递给处理函数并发送给客户端
使用 SSE 技术。我的问题是:当客户端断开连接时,我知道如何停止和退出
处理函数;然而,运行 getData() 函数的 goroutine 继续运行。什么可以
我要关闭它吗?根据stackoverflow上的其他答案,我能想到的一种解决方案是
发送信号以关闭另一个通道上的 goroutine 并使用 select 语句来处理这个
信号。例如,我可以替换
for cur.Next(&rec) {
c <- rec
}
在下面的函数定义中:
for cur.Next(&rec) {
select {
case <- closesignal:
return
default:
c <- rec
}
}
其中,closesignal 是另一个通道,作为getData() 的第三个参数给出,并且
当客户端断开连接时,处理程序会在此通道上发送一条消息。
这种方式的问题是:如果具体rethinkdb查询的结果怎么办
从不更新。在这种情况下,不会进入for cur.Next(&rec) 循环,也不会使用closesignal。
这个 goroutine 会继续运行吗?如果是这样,我该如何停止这个 goroutine?
getData() 函数
func getData(session *r.Session, c chan interface{}) {
var rec interface{}
changesOpts := r.ChangesOpts{
IncludeInitial: true,
}
cur, err := r.DB(DBNAME).Table("test").Changes(changesOpts).Run(session)
if err != nil {
log.Println(err)
return
}
defer cur.Close()
defer func() {
fmt.Println("exiting getData goroutine()...")
}()
for cur.Next(&rec) {
c <- rec
}
}
【问题讨论】: