Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: fan-out, fan-in, goroutine, channel, concurrency

Что такое fan-out и fan-in в контексте goroutine?

Вопрос проверяет понимание паттернов конкурентности в Go для эффективного управления goroutine и каналами.

Короткий ответ

Fan-out — это когда одна goroutine отправляет данные в несколько каналов или запускает несколько worker goroutine для параллельной обработки. Fan-in — это когда несколько goroutine отправляют данные в один канал, который читается одной goroutine. Эти паттерны используются для распараллеливания задач и объединения результатов.

Длинный ответ

Что такое fan-out и fan-in?

Fan-out и fan-in — это два взаимодополняющих паттерна конкурентности в Go, которые позволяют эффективно распределять работу между несколькими goroutine и собирать результаты. Fan-out означает разделение потока данных на несколько параллельных обработчиков, а fan-in — объединение результатов из нескольких источников в один поток.

Fan-out (разветвление)

При fan-out одна goroutine (обычно продюсер) отправляет данные в несколько каналов или запускает несколько worker goroutine, которые обрабатывают данные параллельно. Это полезно, когда задача может быть разбита на независимые подзадачи, которые можно выполнять одновременно.

func fanOut(input <-chan int, workers int) []<-chan int {
    channels := make([]<-chan int, workers)
    for i := 0; i < workers; i++ {
        ch := make(chan int)
        go func() {
            for val := range input {
                ch <- val * 2 // обработка
            }
            close(ch)
        }()
        channels[i] = ch
    }
    return channels
}

Fan-in (сведение)

При fan-in несколько goroutine отправляют данные в один общий канал, который читается одной goroutine (потребителем). Это позволяет объединить результаты параллельной работы в единый поток для дальнейшей обработки.

func fanIn(channels ...<-chan int) <-chan int {
    out := make(chan int)
    var wg sync.WaitGroup
    for _, ch := range channels {
        wg.Add(1)
        go func(c <-chan int) {
            defer wg.Done()
            for val := range c {
                out <- val
            }
        }(ch)
    }
    go func() {
        wg.Wait()
        close(out)
    }()
    return out
}

Применение на практике

Эти паттерны часто используются вместе: сначала fan-out для распараллеливания обработки данных (например, обработка HTTP-запросов, вычисления), затем fan-in для сбора результатов. Это основа для построения конвейеров обработки данных (pipeline) в Go.

Вывод: Fan-out и fan-in — ключевые паттерны для эффективного использования goroutine и каналов, позволяющие создавать масштабируемые и производительные конкурентные приложения в Go.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Golang

    Golang

Ключевые слова

#fan-out

#fan-in

#goroutine

#channel

#concurrency

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.