Перейти к содержимому

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 ")
}
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()
}