Fan-Out - это шаблон обмена сообщениями, используемый для распределения работы между работниками.
Можно смоделировать Fan-Out, используя каналы Go.
// Разделить канал на n каналов,
// которые получают сообщения в циклическом порядке.
func Split(ch <-chan int, n int) []<-chan int {
// Создаем пул из n каналов
cs := make([]chan int)
for i := 0; i < n; i++ {
cs = append(cs, make(chan int))
}
// Распределяет работу в круговом порядке
// среди указанного числа каналов,
// пока основной канал не будет закрыт.
// При закрытии основного канала закрывает
// все каналы и возвращается.
toChannels := func(ch <-chan int, cs []chan<- int) {
// Закрываем каждый канал,
// когда выполнение заканчивается.
defer func(cs []chan<- int) {
for _, c := range cs {
close(c)
}
}(cs)
// Направляем сообщения из
// основного канала ch
// в каналы из пула cs
for {
for _, c := range cs {
select {
case val, ok := <-ch:
if !ok {
return
}
c <- val
}
}
}
}
go toChannels(ch, cs)
return cs
}
Функция `Split` преобразует один канал в список каналов с помощью goroutine для копирования полученных значений по каналам в списке в циклическом порядке.
Читайте также:
- Паттерны конкурентности в Golang: пайплайны
- Модель памяти Go
- Использование sync.WaitGroup для ожидания завершения нескольких goroutine
- Паттерны в Golang
Комментариев нет:
Отправить комментарий