Назад к задачам
Junior — Senior
8

Одновременное скачивание контента с множества веб‑ресурсов

Получайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Условие задачи

Требуется написать функцию ParallelDownload, которая будет обрабатывать поступающие URL‑адреса параллельно, используя заданное количество воркеров, и возвращать отображение (map) с результатами загрузки контента для каждого сайта.

package 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)
  }
}