Fan-In - это паттерн обмена сообщениями, используемый для создания воронки для работы среди исполнителей. Источником сообщений могут быть клиенты, а место назначения - сервер.
Мы можем смоделировать Fan-In паттерн используя каналы Go.
// Объединяем разные каналы в один канал
func Merge(cs ...<-chan int) <-chan int {
var wg sync.WaitGroup
out := make(chan int)
// Запускаем send goroutine
// для каждого входящего канала в cs.
// send копирует значения из c в out
// до тех пор пока c не закрыт, затем вызываем wg.Done.
send := func(c <-chan int) {
for n := range c {
out <- n
}
wg.Done()
}
wg.Add(len(cs))
for _, c := range cs {
go send(c)
}
// Запускаем goroutine чтобы закрыть out
// когда все send goroutine выполнены
// Это должно начаться после вызова wg.Add.
go func() {
wg.Wait()
close(out)
}()
return out
}
Функция `Merge` преобразует список каналов в один канал, запуская goroutine для каждого входящего канала, которая копирует значения в единственный исходящий канал.
Как только все send goroutine были запущены, запускается отдельная goroutine с функцией, ожидающей завершения всех запущенных, чтобы закрыть основной канал.
Читайте также:
- Паттерны конкурентности в Golang: пайплайны
- Модель памяти Go
- Использование sync.WaitGroup для ожидания завершения нескольких goroutine
- Паттерны в Golang
Комментариев нет:
Отправить комментарий