我正在使用多个 goroutine 从 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) {
...............
}
}
如果有多个 goroutine 调用
cursor.Next
,那么当 任意 的 goroutine 调用 cursor.Next
时,光标将在所有 goroutinges 中前进。您可能想要做的是有一个 goroutine 来读取,但是您可以将结果传递到一个通道,然后您可以在单独的 goroutine 中“处理”每个文档。比如:
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
}
然后显然要确保在处理完结果后退出 goroutine。