Как дождаться окончания работы рутин и чтения канала без блокировки?

Я рассмотрел здесь несколько примеров и вопросов по SO, но все еще не могу получить довольно простой код, работающий как положено:

func main() {
    ch := make(chan string)
    var wg sync.WaitGroup
    wg.Add(2)
    go readFile("A", ch, wg)
    go readFile("B", ch, wg)
    go func() {
        wg.Wait()
        close(ch)
    }()
    printer(ch)
}

func readFile(name string, ch chan string, wg sync.WaitGroup) {
    file, err := os.Open(name)
    if err != nil {
        fmt.Errorf("was not able to read from file %s: %s", name, err)
    }
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        ch <- scanner.Text()
    }
    wg.Done()
}

func printer(ch chan string) {
    for val := range ch {
        fmt.Println(val)
    }
}

Поэтому я читаю из двух файлов, вставляю строки чтения в канал, а затем просто распечатываю их (часть кода была упрощена из ненужных деталей)

Две подпрограммы, WaitGroup для них обоих, восстанавливают подпрограмму Wait и закрывают канал.

С моей точки зрения, это в значительной степени совпадает с этим вопросом и полученным ответом: пусть golang закроет используемый канал после завершения всех операций

Так что не так в моем случае?

1 ответ

Решение

Начните с следования документации по sync.WaitGroup инструкции:

Синхронизация пакетов

import "sync"

введите WaitGroup

Группа WaitGroup ожидает завершения сбора программ. Основные вызовы процедуры Добавить, чтобы установить число ожидающих ожидания. Затем каждая из программ запускается и вызывает Готово, когда закончите. В то же время, Wait может использоваться, чтобы заблокировать, пока все goroutines не закончили.

WaitGroup нельзя копировать после первого использования.


WaitGroup нельзя копировать после первого использования.

Другие вопросы по тегам