У меня есть большое количество объектов в корзине GCS, которые я хочу перечислить как можно быстрее. В GCS API docs показан этот пример:
it := client.Bucket(bucket).Objects(ctx, nil)
for {
attrs, err := it.Next()
if err == iterator.Done {
break
}
if err != nil {
return fmt.Errorf("Bucket(%q).Objects: %v", bucket, err)
}
fmt.Fprintln(w, attrs.Name)
}
Но в API docs говорится, что итератор, возвращаемый Objects
, небезопасен для параллелизма.
wiki показывает iterator.Pager
для управления разбивкой на страницы, но без примеров для параллелизма:
it := client.Books(ctx, shelfName)
p := iterator.NewPager(it, pageSize, "")
for {
var books []*library.Book
nextPageToken, err := p.NextPage(&books)
if err != nil {
return err
}
for _, b := range books {
process(b)
}
if nextPageToken == "" {
break
}
}