Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich in Go eine optisch ansprechende Warte-/Beschäftigt-Anzeige für lang laufende Prozesse erstellen?

Wie kann ich in Go eine optisch ansprechende Warte-/Beschäftigt-Anzeige für lang laufende Prozesse erstellen?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-24 18:59:02784Durchsuche

How can I create a visually appealing waiting/busy indicator for long-running processes in Go?

Erstellen eines Warte-/Beschäftigt-Indikators für ausgeführte Prozesse

Beim Ausführen untergeordneter Prozesse, wie im bereitgestellten Beispiel, kann es von Vorteil sein, Folgendes bereitzustellen Visuelle Rückmeldung an den Benutzer, die anzeigt, dass der Prozess ausgeführt wird, insbesondere wenn die Ausführungszeit lang sein kann. Dadurch kann verhindert werden, dass der Benutzer denkt, das Programm sei eingefroren.

Um einen Warte-/Beschäftigt-Indikator zu erstellen, besteht ein Ansatz darin, eine Goroutine zu verwenden, um während der Ausführung des Prozesses regelmäßig etwas zu drucken. Wenn der Prozess abgeschlossen ist, kann ein Signal an die Goroutine gesendet werden, um ihn zu beenden.

Hier ist ein Codebeispiel, das diesen Ansatz demonstriert:

<code class="go">package main

import (
    "fmt"
    "log"
    "os/exec"
    "time"
)

func indicator(shutdownCh <-chan struct{}) {
    ticker := time.NewTicker(time.Second)
    defer ticker.Stop()
    for {
        select {
        case <-ticker.C:
            fmt.Print(".")
        case <-shutdownCh:
            return
        }
    }
}

func main() {
    cmd := exec.Command("npm", "install")
    log.Printf("Running command and waiting for it to finish...")

    // Start indicator:
    shutdownCh := make(chan struct{})
    go indicator(shutdownCh)

    err := cmd.Run()

    close(shutdownCh) // Signal indicator() to terminate

    fmt.Println()
    log.Printf("Command finished with error: %v", err)
}</code>

Dieser Code verwendet einen Ticker, um einen Punkt zu drucken jede Sekunde und einen Shutdown-Kanal, um der Indikator-Goroutine zu signalisieren, dass sie beendet wird, wenn der Prozess abgeschlossen ist.

Um alle fünf Punkte eine neue Zeile zu beginnen, ändern Sie die Indikatorfunktion wie folgt:

<code class="go">func indicator(shutdownCh <-chan struct{}) {
    ticker := time.NewTicker(time.Second)
    defer ticker.Stop()
    for i := 0; ; {
        select {
        case <-ticker.C:
            fmt.Print(".")
            if i++; i%5 == 0 {
                fmt.Println()
            }
        case <-shutdownCh:
            return
        }
    }
}</code>

Durch die Implementierung dieser Art von Indikator können Sie Benutzern ein klares visuelles Feedback geben, das anzeigt, dass der Prozess ausgeführt wird und nicht eingefroren ist.

Das obige ist der detaillierte Inhalt vonWie kann ich in Go eine optisch ansprechende Warte-/Beschäftigt-Anzeige für lang laufende Prozesse erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn