Maison  >  Article  >  développement back-end  >  Comment créer un indicateur d'attente/occupé pour les processus exécutés dans Go ?

Comment créer un indicateur d'attente/occupé pour les processus exécutés dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-25 06:21:02358parcourir

How to Create a Waiting/Busy Indicator for Executed Processes in Go?

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

Lors de l'exécution de processus enfants dans Go, tels que l'installation de packages npm à l'aide de exec.Command, il peut prendre un certain temps avant que la sortie soit visible. Pour améliorer l'expérience utilisateur, pensez à afficher un indicateur d'occupation pour indiquer que le processus est en cours.

Solution :

Une solution efficace consiste à utiliser une goroutine distincte pour périodiquement imprimer des caractères, tels que des points, sur la console pendant l'exécution du processus. Une fois le processus terminé, la goroutine de l'indicateur peut être terminée.

<code class="go">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>

Pour un indicateur plus attrayant visuellement, vous pouvez modifier la fonction de l'indicateur pour imprimer une nouvelle ligne après un nombre spécifique de points, tel que 5 :

<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 cette solution, vous pouvez fournir un signal visuel aux utilisateurs indiquant qu'un processus est en cours d'exécution, améliorant ainsi l'expérience utilisateur et rendant l'application plus réactive.

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