Я хотел бы понять, правильны ли мои логики c вокруг WaitGroups, и посмотреть, есть ли более эффективный способ структурирования моего кода. Цель состоит в том, чтобы выполнить задачи как можно быстрее.
Мой код заполняет канал _urls
, который заполняется через stdin. Затем я раскручиваю две группы WaitGroup, одну из которых читает с этого канала _urls
, а другую - с канала _downloads
, который подается из программы в первой группе WaitGroup.
По сути код выглядит следующим образом:
// declare channels
_urls := make(chan string)
_downloads := make(chan string)
// first waitgroup with 2 goroutines
var wg sync.WaitGroup
for i := 0; i < concurrency; i++ {
wg.Add(2)
go func() {
defer wg.Done()
for url := range _urls {
// perform GET request and inspect the responseBody
}
}()
go func() {
defer wg.Done()
for url := range _urls {
// perform a HEAD request to look for a certain file
// if the file exists, send to the _downloads channel
_downloads <- url
}
}()
}
// second waitgroup with 1 goroutine
var dwg sync.WaitGroup
for i := 0; i < concurrency; i++ {
dwg.Add(1)
go func() {
defer wg.Done()
for url := range _downloads {
// perform the download
}
}()
}
Меня беспокоит вопрос, является ли это эффективным способом подачи на канал _downloads
, или было бы разумнее просто выполнить скачать в первой WaitGroup.