我正在经历一些奇怪的行为。我正在尝试设置一个小型 web 应用程序,该应用程序使用在 Ubuntu 12.04 服务器上运行的 Aerospike 3.5 社区获取一些数据。我正在使用默认的 aerospike.conf 文件(使用“test”命名空间)并遵循如何在此处查询的示例。当我尝试使用过滤器查询某些记录时,错误通道随机返回零错误。(此示例指向我的开发数据库实例)。要多次复制、编译和运行以下命令,您将看到返回的数据或恐慌:package mainimport ( "fmt" "github.com/aerospike/aerospike-client-go")func main() { c, err := aerospike.NewClient("52.7.157.46", 3000) if err != nil { panic(err) } recs := liststuff(c) fmt.Printf("got results: %v", recs)}func liststuff(client *aerospike.Client) []*aerospike.Record { // fetch some records with a filter stm := aerospike.NewStatement("test", "products") stm.Addfilter(aerospike.NewEqualFilter("visible", 1)) fmt.Println("querying...") recordset, err := client.Query(nil, stm) if err != nil { panic(err) } // collect results into a slice recs := []*aerospike.Record{}L: for { select { case rec, chanOpen := <-recordset.Records: if !chanOpen { break L } fmt.Println("found record %v", rec) recs = append(recs, rec) case err := <-recordset.Errors: if err != nil { panic(err) } else { panic(fmt.Errorf("error nil when it should exist")) } return nil } } return recs}
3 回答
蝴蝶不菲
TA贡献1810条经验 获得超4个赞
只是为了发布更新,当服务器端的记录流结束时,错误和记录通道都会自动关闭,因此错误通道的值为 nil。
所以这毕竟不是错误。我们已经相应地更新了 Aerospike 用户论坛帖子中的主题。
慕妹3242003
TA贡献1824条经验 获得超6个赞
我不熟悉 aerospike 包,但运行您的示例代码表明,无论是否返回数据,它总是会发生恐慌。
这意味着Errors
通道总是发送error
或nil
。如果这是预期的行为,您必须相应地处理它,并且只有在错误不是nil
.
nil
在通道上发送仍然意味着在通道上正在发送一个值,它将触发 select 语句。因此对 a 的恐慌nil error
。
您看到的随机性,即有时返回数据,有时不返回是由于 select 语句的性质。如果同时发送 data 和 anil error
两种情况都为真,并且 select 将伪随机选择两者之一。
如果可以进行一个或多个通信,则通过统一伪随机选择选择可以进行的单个通信。否则,如果存在默认情况,则选择该情况。如果没有默认情况,“select”语句会阻塞,直到至少有一个通信可以继续。
如果它首先选择数据通道,它将打印数据,然后在下一次迭代中选择错误通道和恐慌。如果它首先选择错误通道,它会发生恐慌并且数据永远不会打印。
- 3 回答
- 0 关注
- 189 浏览
添加回答
举报
0/150
提交
取消