Параллельная загрузка контента с сайтов
Условие задачи
Необходимо реализовать функцию ParallelDownload, которая должна параллельно обрабатывать входящие URL-адреса с помощью заданного количества воркеров и возвращать карту с результатами скачивания контента для каждого сайта
gopackage main
import (
"context"
"fmt"
"math/rand"
"time"
)
type SiteContent struct {
Title string
Date time.Time
Content string
}
// Функция для имитации долгой работы, загрузки контента сайта
func DownloadSiteContent(ctx context.Context, url string) SiteContent {
// Генерация случайного времени ожидания от 5 до 10 секунд
rand.Seed(time.Now().UnixNano())
sleepTime := time.Duration(rand.Intn(6)+5) * time.Second
// Ожидание случайного времени
time.Sleep(sleepTime)
// Возвращаем имитацию контента сайта
return SiteContent{
Title: "Заголовок сайта " + url,
Date: time.Now(),
Content: "Содержание сайта " + url,
}
}
// Функция для параллельного скачивания контента сайтов
func ParallelDownload(ctx context.Context, urls <-chan string, numWorkers int) map[string]SiteContent {
// TODO
return nil
}
func main() {
urls := make(chan string)
// Запускаем функцию для параллельного скачивания контента
go func() {
urls <- "http://example.com"
urls <- "http://example.org"
urls <- "http://example.net"
close(urls)
}()
// Запускаем параллельное скачивание с максимальным количеством воркеров
result := ParallelDownload(context.Background(), urls, 3)
// Выводим результаты
for url, content := range result {
fmt.Printf("Сайт: %s\nЗаголовок: %s\nДата: %s\nСодержание: %s\n\n",
url, content.Title, content.Date, content.Content)
}
}