Maison > développement back-end > Golang > le corps du texte

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

Linda Hamilton
Libérer: 2024-10-25 02:37:30
original
390 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!