Как дождаться окончания работы рутин и чтения канала без блокировки?
Я рассмотрел здесь несколько примеров и вопросов по 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 ожидает завершения сбора программ. Основные вызовы процедуры Добавить, чтобы установить число ожидающих ожидания. Затем каждая из программ запускается и вызывает Готово, когда закончите. В то же время, Wait может использоваться, чтобы заблокировать, пока все goroutines не закончили.
WaitGroup нельзя копировать после первого использования.
WaitGroup нельзя копировать после первого использования.