Назад к задачам
Middle — Senior
6

Ускорение параллельного получения данных о пользователях за фиксированный срок

Компании, где спрашивали:

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

Необходимо доработать функцию Do, чтобы она:

  • завершала обработку любого количества пользователей ровно за 10 мс;
  • запускала запросы к fetchByName параллельно;
  • корректно учитывала контекст ctx и передавала возникающие ошибки наружу.
import (
    "context"
    "fmt"
    "math/rand"
    "time"
)

func main() {
    fmt.Println(Do(context.Background(), []User{{"aaa"}, {"bbb"}, {"ccc"}, {"ddd"}, {"eee"}}))
}

type User struct {
    Name string
}

func fetchByName(ctx context.Context, userName string) (int, error) {
    // имитируем сетевой запрос, который занимает 10 мс
    time.Sleep(10 * time.Millisecond)
    return rand.Int() % 100000, nil
}

func Do(ctx context.Context, users []User) (map[string]int, error) {
    resultMap := make(map[string]int)
    // TODO: реализовать параллельный вызов fetchByName и собрать результаты в resultMap
    // при возникновении ошибки сразу вернуть текущие данные и ошибку
    // обеспечить, что общее время работы функции не превышает 10 мс независимо от количества пользователей
    return resultMap, nil
}