Maison  >  Article  >  développement back-end  >  Comment puis-je créer un indicateur d'attente/occupé visuellement attrayant pour les processus de longue durée dans Go ?

Comment puis-je créer un indicateur d'attente/occupé visuellement attrayant pour les processus de longue durée dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-24 18:59:02784parcourir

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

Création d'un indicateur d'attente/occupé pour les processus exécutés

Lors de l'exécution de processus enfants, comme dans l'exemple fourni, il peut être avantageux de fournir retour visuel à l'utilisateur indiquant que le processus est en cours d'exécution, en particulier lorsque le temps d'exécution peut être long. Cela peut aider à empêcher l'utilisateur de penser que le programme est gelé.

Pour créer un indicateur d'attente/occupé, une approche consiste à utiliser une goroutine pour imprimer périodiquement quelque chose pendant l'exécution du processus. Une fois le processus terminé, un signal peut être envoyé à la goroutine pour y mettre fin.

Voici un exemple de code qui illustre cette approche :

<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>

Ce code utilise un ticker pour imprimer un point toutes les secondes et un canal d'arrêt pour signaler à la goroutine de l'indicateur de se terminer lorsque le processus est terminé.

Pour démarrer une nouvelle ligne tous les cinq points, modifiez la fonction de l'indicateur comme suit :

<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>

En mettant en œuvre ce type d'indicateur, vous pouvez fournir un retour visuel clair aux utilisateurs, indiquant que le processus est en cours et n'est pas gelé.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn