提问人:Purushottam Hirave 提问时间:11/10/2023 最后编辑:Purushottam Hirave 更新时间:11/10/2023 访问量:24
如何从 mongo-driver go 包访问多个 goroutine 中的同一游标
How to access a same cursor in multiple goroutines from mongo-driver go package
问:
我正在使用多个 goroutines 从 MongoDB golang sdk 中的光标读取文档。但它没有返回所有文件。注意:它与单个 goroutine 一起正常工作。
我想从多个 goroutine 中读取来自同一集合游标的所有文档
示例代码:
cursor, err := coll.Find(context.TODO(), filter, opts)
if err != nil {
fmt.Println("Finding all documents ERROR:", err)
defer cursor.Close(ctx)
// If the API call was a success
} else {
// iterate over docs using Next()
for cursor.Next(ctx) {
...............
}
}
答:
1赞
dave
11/10/2023
#1
如果您有多个 goroutines 调用 ,那么当任何 goroutines 调用时,光标将在所有 goroutinges 中前进。你可能想做的是有一个用于读取的 goroutine,但随后你可以将结果传递给一个通道,然后你可以在一个单独的 goroutine 中处理每个文档。像这样:cursor.Next
cursor.Next
dataChannel := make(chan mongoResult)
func handleMongoResults() {
for {
res := <-dataChannel
// do something
}
}
go handleMongoResults()
go handleMongoResults()
for cursor.Next(ctx) {
var result mongoResult
if err := cursor.Decode(&result); err != nil {
log.Fatal(err)
}
dataChannel <- result
}
然后显然,请确保在处理完结果后退出 goroutines。
评论
0赞
Purushottam Hirave
12/3/2023
谢谢!!!。但是如果我使用光标。All() 占用了总时间的 98%。如果我在不同的 goroutine 上运行不同的集合,则光标。All() 花费的时间几乎翻了一番。如何解决此问题?
评论