Google Cloud Storage - одновременное отображение объектов (Go) - PullRequest
0 голосов
/ 02 августа 2020

У меня есть большое количество объектов в корзине 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
    }
}

1 Ответ

1 голос
/ 03 августа 2020
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
    }
}

Вы можете добавить к этому коду параллелизм, запустив более трудоемкую часть вашего кода в отдельных горутинах. Предполагая, что функция process(book *library.Book) работает в течение длительного времени, вы можете использовать

for _, b := range books {
    go process(b)
}

или

go func(books []*library.Book) {
    for _, b := range books {
        process(b)
    }
}(books)

или даже их комбинацию, в зависимости от того, как ваш process функции работает. Поскольку итератор небезопасен для параллелизма, старайтесь избегать его совместного использования, но вы можете делать все, что захотите, со значением, извлеченным из каждой итерации. Вы можете попробовать применить тот же logi c с первым примером кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...