Задача следующая, в файле лежит много ссылок, мне нужно проверить их доступность.
Для этого создаю n воркеров, которые должны стукнуть в ссылку, записать результат и вызвать нового воркера, так пока ссылки не закончатся. Но есть проблема, ссылки добавляются в канал медленнее, чем потребляются воркерами. Не очень хочется выгружать весь файл в оперативку, можно ли решить этот вопрос без предварительной загрузки всего файла в канал?
Сейчас есть вот такой код, воркер вместо запроса просто выводит в консоль ссылку:
func main() {
urls := make(chan string)
go fillChannel(urls)
for i := 0; i < 5; i++ {
go requestWorker(urls)
}
time.Sleep(time.Second * 30)
}
func requestWorker(channel chan string) {
if len(channel) <= 0 {
println("Worker stopped")
return
}
url := <-channel
println(url)
go requestWorker(channel)
}
func fillChannel(channel chan string) {
file, err := os.Open("data.txt")
defer file.Close()
if err != nil {
fmt.Println(err)
}
fileScanner := bufio.NewScanner(file)
fileScanner.Split(bufio.ScanLines)
for fileScanner.Scan() {
channel <- fileScanner.Text()
}
}