Проблема в том, что вы хотите, чтобы все ваши запущенные программы чтения закончились, прежде чем вы продолжите и истощите канал, по которому они доставляют результаты.
И канал буферизуется, который может содержать до 10элементы.Как только 10 goroutines отправят на него сообщение, остальные будут заблокированы, поэтому они никогда не будут завершены (так как чтение с этого канала может начаться только после того, как все они вернутся: это тупик).
Так что вместо этого вы должнызапустите другую процедуру, чтобы получать результаты одновременно с программами чтения:
done := make(chan struct{})
go readChannel(channel, done)
fmt.Println("waiting")
wg.Wait()
fmt.Println("wait over")
close(channel)
// Wait for completion of collecting the results:
<-done
Где чтение канала должно быть for range
(которое заканчивается, когда канал закрыт, и все значения, полученные от него, были полученыотправлено на него до того, как оно было закрыто):
func readChannel(channel chan string, done chan struct{}) {
for data := range channel {
fmt.Print(data)
}
close(done)
}
Обратите внимание, что я использовал канал done
, поэтому основная программа также будет ожидать завершения выполнения процедуры получения результатов.
Такжеобратите внимание, что, поскольку в большинстве случаев дисковый ввод-вывод является узким местом, а не центральным процессором, и, поскольку доставка и получение результатов от нескольких подпрограмм также имеют некоторые накладные расходы, вполне возможно, что вы не увидите никаких улучшений при чтении файла одновременно снесколько горутин.