Шаблон мультиплексирования веера, объясненный с помощью Golang — аналогия с самой быстрой лошадью.

Введение

В информатике мультиплексирование — это система или сигнал, предполагающий одновременную передачу нескольких сообщений по одному каналу связи.
Для удобства мы бы написали решение на Go и использовали каналы Go для реализации кода нашей аналогии. Следовательно, в конце этого поста я бы использовал мировой пример, чтобы объяснить реализацию мультиплексирования с помощью шаблона Fan-in. Мы также увидим, что такое функция-генератор.

Аналогия

Сегодня мы будем рассматривать скачки. Скачки состоят из нескольких лошадей, и вы, как читатель, несете ответственность за это мероприятие. Организаторы мероприятия не знали, что вы разработчик в 10 раз больше. 💪🏽.
Перед мероприятием вы решили посетить место проведения, чтобы все проверить. Во время вашего визита вы начали разыгрывать возможные сценарии, которые могут усложнить вашу задачу.

Во-первых, вы задаетесь вопросом, как эффективно определить самую быструю лошадь, если у вас есть глаза, которые фокусируются на чем-то одном. Вы задаетесь вопросом, как вы можете сосредоточиться на лошадях, поскольку многозадачность не является чем-то, что мы, люди, имеем в нашем дизайне.

0*CjUW470i-exwEmrx

Одно из решений, которое вы придумали как 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. --

Резюме

Таким образом, вы реализовали шаблон веерного мультиплексирования и увидели примеры функций генератора.

Вы также можете получить полный исходный код из этого суть

Если эта методика обучения была вам полезна, вы можете поделиться ею в своих учетных записях в социальных сетях с друзьями или связаться с нами, посетив мой Веб-сайт.

Удачного кодирования. Ваше здоровье.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *