如何从mongo-driver go包中访问多个goroutine中的同一游标

hec6srdp  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(97)

我在MongoDB golang sdk中使用多个goroutine从cursor读取文档。但是它没有返回所有文档。注意:它可以在单个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) {
     ...............
  }

字符串
}

liwlm1x9

liwlm1x91#

如果你有多个goroutine调用cursor.Next,那么当任何一个goroutine调用cursor.Next时,光标将在所有的goroutine中前进。你可能想做的是有一个单独的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
}

字符串
然后,很明显,当你完成处理结果时,要确保退出你的goroutines。

相关问题