Herausforderung

Abgeschlossen

Bei dieser Aufgabe müssen Sie ein vorhandenes Programm verbessern, indem Sie für eine schnellere Ausführung sorgen. Versuchen Sie, die Programme selbst zu schreiben, auch wenn Sie dazu zurückkehren und sich die Beispiele ansehen müssen, die in den praktischen Übungen verwendet wurden. Anschließend vergleichen Sie Ihre Lösung mit der in der nächsten Lerneinheit gezeigten Lösung.

Nebenläufigkeit in Go ist ein komplexes Problem, das Sie durch praktische Anwendung besser verstehen. Diese Aufgabe vermittelt Ihnen lediglich eine Vorstellung davon, welche praktischen Übungen Sie durchführen können.

Viel Glück!

Schnelleres Berechnen von Fibonacci-Zahlen mit Nebenläufigkeit

Verwenden Sie das folgende Programm, um Fibonacci-Zahlen auf sequenzielle Weise zu berechnen:

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func fib(number float64) float64 {
    x, y := 1.0, 1.0
    for i := 0; i < int(number); i++ {
        x, y = y, x+y
    }

    r := rand.Intn(3)
    time.Sleep(time.Duration(r) * time.Second)

    return x
}

func main() {
    start := time.Now()

    for i := 1; i < 15; i++ {
        n := fib(float64(i))
    fmt.Printf("Fib(%v): %v\n", i, n)
    }

    elapsed := time.Since(start)
    fmt.Printf("Done! It took %v seconds!\n", elapsed.Seconds())
}

Sie müssen zwei Programme aus diesem bestehenden Code erstellen:

  • Eine verbesserte Version, bei der Sie Nebenläufigkeit implementieren. Es sollte einige Sekunden dauern, bis die Ausführung abgeschlossen ist (nicht mehr als 15 Sekunden), wie es auch jetzt der Fall ist. Sie sollten gepufferte Kanäle verwenden.

  • Schreiben Sie eine neue Version, mit der Fibonacci-Zahlen berechnet werden, bis der Benutzer mithilfe der fmt.Scanf()-Funktion quit in das Terminal eingibt. Wenn der Benutzer die EINGABETASTE drückt, sollte eine neue Fibonacci-Zahl berechnet werden. Das heißt, dass keine Schleife von 1 bis 10 mehr vorhanden ist.

    Verwenden Sie zwei nicht gepufferte Kanäle: einen zum Berechnen der Fibonacci-Zahl und einen weiteren, der auf die „quit“-Meldung vom Benutzer wartet. Sie müssen die select-Anweisung verwenden.

Hier sehen Sie ein Beispiel für die Interaktion mit dem Programm:

1

1

2

3

5

8

13
quit
Done calculating Fibonacci!
Done! It took 12.043196415 seconds!