Почему программы не обрабатывают один и тот же файл дважды? - PullRequest
0 голосов
/ 06 ноября 2018

Я смотрю в блоге goroutines о шаблонах с goroutines, каналами и т. Д.

В примере bounded.go я вижу это:

    paths, errc := walkFiles(done, root)

    // Start a fixed number of goroutines to read and digest files.
    c := make(chan result) // HLc
    var wg sync.WaitGroup
    const numDigesters = 20
    wg.Add(numDigesters)
    for i := 0; i < numDigesters; i++ {
        go func() {
            digester(done, paths, c) // HLc
            wg.Done()
        }()
    }

Теперь, поскольку каждый варочный котел обрабатывает одну и ту же коллекцию paths, почему он не повторяет один и тот же файл дважды?

1 Ответ

0 голосов
/ 06 ноября 2018

walkFiles, который не был воспроизведен в вашем вопросе, но который является ключом к его пониманию, имеет следующую подпись:

func walkFiles(done <-chan struct{}, root string) (<-chan string, <-chan error)

Таким образом, в вашем цитируемом коде paths - это не «коллекция» (то есть фрагмент), это канал . Когда каждый из рабочих читает из канала, он вытаскивает следующий путь из канала. Следующий рабочий, который получит из канала, не получит тот же путь, он получит следующий после этого.

Все три аргумента digester являются каналами:

func digester(done <-chan struct{}, paths <-chan string, c chan<- result) 
  • done используется для указания рабочим, что они должны остановиться, даже если работа все еще находится в очереди.
  • paths - рабочая очередь, из которой рабочие получают пути.
  • c - канал, по которому рабочие отправляют результаты.
...