MTS / МТС (задачи, ч. 2)
Актуальность: 1 кв 2025
Задача: Написать код функции, которая делает merge N каналов. Весь входной поток перенаправляется в один канал. go/channels
Заголовок раздела «Задача: Написать код функции, которая делает merge N каналов. Весь входной поток перенаправляется в один канал. go/channels»func main() { // Write}
func merge(cs ...<-chan int) <-chan int { // Write}Задача: Вы разрабатываете систему обработки данных для подготовки аналитического отчета о продажах. У вас есть массив чисел, представляющих продажи за каждый день в виде [10, 20, 30, 40, 50, …]. Нужно выполнить следующие шаги обработки данных с использованием Pipeline: go/concurrency
Заголовок раздела «Задача: Вы разрабатываете систему обработки данных для подготовки аналитического отчета о продажах. У вас есть массив чисел, представляющих продажи за каждый день в виде [10, 20, 30, 40, 50, …]. Нужно выполнить следующие шаги обработки данных с использованием Pipeline: go/concurrency»- Шаг 1: Фильтрация. Удалите все продажи меньше заданного порога (например, 30).
- Шаг 2: Увеличение. Увеличьте все оставшиеся значения на определенный процент (например, 10%).
- Шаг 3: Агрегация. Подсчитайте сумму всех значений и выведите результат.
Задача: Необходимо написать Worker Pool, чтобы выполнить параллельно numJobs заданий, используя numWorkers горутин. Эти горутины должны быть запущены один раз за все время выполнения программы. Описание функций: go/concurrency
Заголовок раздела «Задача: Необходимо написать Worker Pool, чтобы выполнить параллельно numJobs заданий, используя numWorkers горутин. Эти горутины должны быть запущены один раз за все время выполнения программы. Описание функций: go/concurrency»- Функция worker: На вход принимает: функцию f, которая выполняет задание; канал jobs для получения аргументов; канал results для записи результатов; Читает задания из канала jobs и записывает результаты выполнения f(job) в канал results.
- Функция main: Запускает функцию worker в количестве numWorkers горутин; В качестве первого аргумента worker использует функцию multiplier; Записывает числа от 1 до numJobs в канал jobs.
Задача: У вас есть список URL-адресов, которые нужно обработать параллельно. Однако одновременно можно запускать не более N горутин. Вместо реального выполнения HTTP-запросов использовать httpGet(). Реализуйте функцию fetchURL, которая: go/concurrency
Заголовок раздела «Задача: У вас есть список URL-адресов, которые нужно обработать параллельно. Однако одновременно можно запускать не более N горутин. Вместо реального выполнения HTTP-запросов использовать httpGet(). Реализуйте функцию fetchURL, которая: go/concurrency»- Захватывает семафор перед началом работы;
- Добавляет результат в общий срез results;
- Освобождает семафор после завершения.
func httpGet(url string) string { time.Sleep(time.Second) return fmt.Sprintf("%s: 200 OK ", url)}
func fetchURL() { // Напишите код здесь.}
func main() { urls := []string{ "https://www.google.com ", "https://www.github.com ", "https://www.stackoverflow.com ", "https://www.reddit.com ", "https://golang.org ", }
const maxConcurrency = 2
results := make([]string, len(urls)) for _, result := range results { fmt.Println(result) }}Задача: Реализуйте очередь с ограничьенным размером, которая использует sync.Map для хранения элементов. Каждый элемент имеет свой уникальный ID, и когда очередь достигает максимального размера, новый элемент должен заменять старый. algorithms/data-structures
Заголовок раздела «Задача: Реализуйте очередь с ограничьенным размером, которая использует sync.Map для хранения элементов. Каждый элемент имеет свой уникальный ID, и когда очередь достигает максимального размера, новый элемент должен заменять старый. algorithms/data-structures»type Queue struct { // TODO}
func (q *Queue) Add(value string) (id int) { // TODO}
func (q *Queue) Get(id int) (value string) { // TODO}
func main() { q := Queue{}
aId := q.Add("A ") bId := q.Add("B ")
fmt.Println(aId, bId)
cId := q.Add("C ")}Задача: Необходимо реализовать функцию LoadConfig. go/basics
Заголовок раздела «Задача: Необходимо реализовать функцию LoadConfig. go/basics»type Config struct { DatabaseURL string Port int}
var config Config
func initConfig() { config = Config{ DatabaseURL: "http://localhost:5432 ", Port: 8080, }}
// Функция, которая вызывает инициализацию конфигурацииfunc LoadConfig() { // TODO}
func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) go func() { defer wg.Done() LoadConfig() }() }
wg.Wait() fmt.Printf("Конфигурация: %+v\n ", config)}Задача: Вам нужно создать пул для объектов, которые используются в тестах. Эти объекты можно переиспользовать в разных тестах, чтобы ускорить процесс тестирования. Требования: linux-os/processes
Заголовок раздела «Задача: Вам нужно создать пул для объектов, которые используются в тестах. Эти объекты можно переиспользовать в разных тестах, чтобы ускорить процесс тестирования. Требования: linux-os/processes»- Напишите структуру TestObject, которая будет имитировать объект, используемый в тестах;
- Реализуйте пул для этих объектов с использованием sync.Pool;
- Каждая горутина должна извлекать объект из пула, использовать его в своем тесте и возвращать обратно.
type TestObject struct { ID int}
func main() { var wg sync.WaitGroup // Использование пула в тестах for i := 0; i < 5; i++ { wg.Add(1) go func(i int) { defer wg.Done() // TODO }(i) }
wg.Wait()}