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!