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

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

Linda Hamilton
Linda Hamiltonoriginal
2024-10-25 02:37:30460parcourir

How to Create a Waiting/Busy Indicator for Long-Running Processes in Go?

Création d'un indicateur d'attente/occupé pour les processus en cours d'exécution

Lors de l'exécution d'un processus enfant tel que « npm install », cela peut prendre beaucoup de temps pour le processus pour compléter et télécharger les packages. Pendant ce temps, il est essentiel de fournir un feedback à l'utilisateur pour lui indiquer que le processus est en cours.

Mise en place d'un indicateur d'occupation

Pour créer un indicateur d'occupation, nous pouvons exploitez une autre goroutine qui s’exécute en même temps que le processus enfant. Cette goroutine imprime périodiquement un caractère (par exemple, un point) sur la console pour montrer l'activité. Lorsque le processus enfant est terminé, nous signalons à la goroutine de se terminer.

<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...")

    shutdownCh := make(chan struct{}) // Channel to signal goroutine termination
    go indicator(shutdownCh)

    err := cmd.Run()

    close(shutdownCh) // Signal indicator goroutine to terminate

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

Personnalisation de l'indicateur

Vous pouvez modifier l'indicateur pour imprimer une nouvelle ligne après un délai spécifique nombre de points en utilisant une version modifiée de la fonction d'indicateur :

<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 fournissant ce retour visuel, vous pouvez tenir les utilisateurs informés que le processus est toujours en cours et éviter toute confusion ou délai d'attente causé par la perception d'inactivité.

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