Fan-in-Multiplexing-Muster mit Golang erklärt – Eine Analogie zum schnellsten Pferd.

Einführung

In der Informatik ist Multiplexing ein System oder Signal, das die gleichzeitige Übertragung mehrerer Nachrichten über einen einzigen Kommunikationskanal beinhaltet.
Praktischerweise würden wir die Lösung in Go schreiben und die Kanäle von go für die Codeimplementierung unserer Analogie verwenden. Daher würde ich am Ende dieses Beitrags einen Weltfall verwenden, um eine Implementierung von Multiplexing mit dem Fan-in-Muster zu erklären. Wir würden auch sehen, was eine Generatorfunktion ist.

Analogie

Heute werden wir über ein Pferderennen nachdenken. Ein Pferderennen besteht aus mehreren Pferden und Sie als Vorleser werden als amtierender Offizier für die Veranstaltung eingesetzt. Unbekannt für die Organisatoren der Veranstaltung sind Sie ein 10x-Entwickler. 💪🏽.
Vor der Veranstaltung haben Sie sich entschieden, den Veranstaltungsort zu besuchen, um sich die Dinge anzusehen. Während Ihres Besuchs haben Sie begonnen, die möglichen Szenarien durchzuspielen, die Ihre Aufgabe erschweren können.

Erstens fragen Sie sich, wie Sie es dem schnellsten Pferd effizient sagen können, wenn Sie mit Augen ausgestattet sind, die sich jeweils auf eine Sache konzentrieren. Sie fragen sich, wie Sie sich auf die Pferde konzentrieren sollen, da Multitasking nicht etwas ist, was wir Menschen in unserem Design haben.

0 * CjUW470i-exwEmrx

Eine der Lösungen, die Sie als 10x-Entwickler gefunden haben, besteht darin, die Pferde dazu zu bringen, Ihnen mitzuteilen, wann sie die Ziellinie überqueren. In Anlehnung an die frühere Definition von Multiplexing werden die Pferde gleichzeitig ihre Zielzeiten an Ihre Ohren übertragen. Ihr Ohr ist der hypothetische einzige Kommunikationskanal. Und wenn alle ihre Zielzeiten an Sie gesendet haben, können Sie den Gewinner als das Pferd bestimmen, das am wenigsten Zeit benötigt hat, um das Rennen zu beenden.

Code-Lösung

Wir beginnen zunächst damit, die Anzahl der Pferde zu ermitteln, die laufen würden. In unserem Beispiel würden wir mit den folgenden fünf Pferden arbeiten: Gem, Frank, Lilly, Arnold und Ola.

Bedenke die track() Funktion unten. Jedes Pferd wird an die übergeben track() Funktion und der Einfachheit halber die track() Die Funktion simuliert die Rennzeit für ein Pferd und übergibt dann den Pferdenamen und die Beendigungszeit des Rennens an den Ausgangskanal.

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
}

Tipp: 1e6 entspricht eins multipliziert mit zehn hoch sechs (dh 1 * 10⁶)

Das track() Die obige Funktion ist ein Beispiel für die Implementierung einer Generatorfunktion. Es generiert die Daten, die uns über die Zeit informieren, die ein Pferd benötigt, um ein Rennen zu beenden.

Wir müssten jetzt alle Pferde gleichzeitig verfolgen, und wir würden dies tun, indem wir alle einfächern track() Antworten für die Pferde im Rennen. Bedenke die fanInHorse() Funktion unten.

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() Funktion dauert alle track() Antworten und leiten sie an einen einzelnen Kanal weiter. Dies ist gleichbedeutend mit unserer Augenbeobachtung, da wir jetzt nur noch einen Kanal betrachten, anstatt fünf Kanäle zu beobachten.

Die vollständige Version von RaceHorses() unten fügt hinzu, wie wir die Ausgabe des Kanals in der Reihenfolge drucken, in der sie eingegangen sind, dh zuerst rein, zuerst raus.

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. - ")
}

Eine Musterantwort der RaceHorses() ist unten angegeben. Von der Stichprobe ist Frank das schnellste Pferd.

-- Race starts. --
Frank 34ms
Ola 47ms
Gem 47ms
Arnold 57ms
Lilly 98ms
-- Race ends. --

Zusammenfassung

Damit haben Sie ein Fan-in-Multiplexing-Muster implementiert und Beispiele für Generatorfunktionen gesehen.

Sie können auch den vollständigen Quellcode von diesem erhalten Kern

Wenn diese Unterrichtsmethode nützlich war, können Sie sie über Ihre Social-Media-Konten für Ihre Freunde teilen oder Kontakt aufnehmen, indem Sie my besuchen Webseite.

Viel Spaß beim Codieren. Prost.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *