Шаблон мультиплексирования веера, объясненный с помощью Golang — аналогия с самой быстрой лошадью.
Введение
В информатике мультиплексирование — это система или сигнал, предполагающий одновременную передачу нескольких сообщений по одному каналу связи.
Для удобства мы бы написали решение на Go и использовали каналы Go для реализации кода нашей аналогии. Следовательно, в конце этого поста я бы использовал мировой пример, чтобы объяснить реализацию мультиплексирования с помощью шаблона Fan-in. Мы также увидим, что такое функция-генератор.
Аналогия
Сегодня мы будем рассматривать скачки. Скачки состоят из нескольких лошадей, и вы, как читатель, несете ответственность за это мероприятие. Организаторы мероприятия не знали, что вы разработчик в 10 раз больше. 💪🏽.
Перед мероприятием вы решили посетить место проведения, чтобы все проверить. Во время вашего визита вы начали разыгрывать возможные сценарии, которые могут усложнить вашу задачу.
Во-первых, вы задаетесь вопросом, как эффективно определить самую быструю лошадь, если у вас есть глаза, которые фокусируются на чем-то одном. Вы задаетесь вопросом, как вы можете сосредоточиться на лошадях, поскольку многозадачность не является чем-то, что мы, люди, имеем в нашем дизайне.
Одно из решений, которое вы придумали как 10-кратный разработчик, — заставить лошадей сообщать вам, когда они пересекают финишную черту. Заимствуя из более раннего определения мультиплексирования, лошади будут одновременно передавать вам свое финишное время. Ваше ухо является гипотетическим единственным каналом связи. И когда все они пришлют вам свое время финиша, вы сможете определить победителя как лошадь, которой потребовалось наименьшее количество времени для завершения гонки.
Код Решение
Сначала мы начнем с определения количества лошадей, которые будут бежать. В нашем примере мы будем работать со следующими пятью лошадьми: Джем, Фрэнк, Лилли, Арнольд и Ола.
Рассмотрим track()
функция ниже. Каждая лошадь будет передана track()
функции и для простоты track()
Функция имитирует время скачки для лошади, а затем передает имя лошади и время завершения скачки в выходной канал.
func track(name string) <-chan string {
c := make(chan string)
go func() {
// Simulate random race time for a horse
d := time.Duration(rand.Intn(1e2)) * time.Millisecond
time.Sleep(d)
// End simulation
c <- fmt.Sprintf("%s %d%s", name, d/1e6, "ms")
}()
return c
}
Совет: 1e6 эквивалентно единице, умноженной на десять в степени шесть (т. е. 1 * 10⁶).
track()
приведенная выше функция является примером реализации функции генератора. Он генерирует данные, которые сообщают нам о времени, затраченном лошадью на финиш.
Теперь нам нужно будет отслеживать всех лошадей одновременно, и мы будем делать это, обмахивая веером все track()
ответы для лошадей в гонке. Рассмотрим fanInHorse()
функция ниже.
func RaceHorses() {
// seed to enable proper random race time generation per horse
rand.Seed(time.Now().UTC().UnixNano())
fmt.Println(" - Race starts. - \n ")
c := fanInHorse(track("Gem"), track("Frank"), track("Lilly"), track("Arnold"), track("Ola"))
.
.
.
}
func fanInHorse(hn …<-chan string) <-chan string {
c := make(chan string)
for _, v := range hn {
go func(i <-chan string) {
c <- <-i
}(v)
}
return c
}
fanInHorse()
функция возьмет на себя все track()
ответы и передавать их в один канал. Это синоним нашего наблюдения глазами, поскольку теперь мы смотрим только на один канал вместо пяти каналов.
Полная версия RaceHorses()
ниже показано, как мы печатаем выходные данные канала в том порядке, в котором они поступили, то есть в порядке поступления.
func RaceHorses() {
// seed to enable proper random race time generation per horse
rand.Seed(time.Now().UTC().UnixNano())
fmt.Println(" - Race starts. - \n ")
c := fanInHorse(track("Gem"), track("Frank"), track("Lilly"), track("Arnold"), track("Ola"))
for i := 0; i < 5; i++ {
fmt.Printf("%s \n", <-c)
}
fmt.Println("\n - Race ends. - ")
}
Образец ответа на RaceHorses()
приведен ниже. Из выборки Франк — самая быстрая лошадь.
-- Race starts. --
Frank 34ms
Ola 47ms
Gem 47ms
Arnold 57ms
Lilly 98ms
-- Race ends. --
Резюме
Таким образом, вы реализовали шаблон веерного мультиплексирования и увидели примеры функций генератора.
Вы также можете получить полный исходный код из этого суть
Если эта методика обучения была вам полезна, вы можете поделиться ею в своих учетных записях в социальных сетях с друзьями или связаться с нами, посетив мой Веб-сайт.
Удачного кодирования. Ваше здоровье.