ホームページ  >  記事  >  バックエンド開発  >  Go で長時間実行プロセスの待機/ビジー インジケーターを作成する方法

Go で長時間実行プロセスの待機/ビジー インジケーターを作成する方法

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-25 02:37:30377ブラウズ

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

実行中のプロセスの待機/ビジー インジケーターの作成

「npm install」などの子プロセスを実行する場合、処理にかなりの時間がかかることがあります。パッケージを完了してダウンロードするプロセス。この間、プロセスが進行中であることを示すフィードバックをユーザーに提供することが重要です。

ビジー インジケーターの実装

ビジー インジケーターを作成するには、次のことができます。子プロセスと同時に実行される別の goroutine を利用します。このゴルーチンは、アクティビティを示すために定期的に文字 (ドットなど) をコンソールに出力します。子プロセスが完了すると、ゴルーチンに終了するよう通知します。

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

インジケーターのカスタマイズ

特定の行の後に新しい行を出力するようにインジケーターを変更できます。インジケーター関数の修正バージョンを使用したドットの数:

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

この視覚的なフィードバックを提供することで、プロセスがまだ実行中であることをユーザーに知らせ、非アクティブの認識によって引き起こされる混乱やタイムアウトを防ぐことができます。

以上がGo で長時間実行プロセスの待機/ビジー インジケーターを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。