首頁  >  文章  >  後端開發  >  如何在 Go 中為長時間運行的進程創建一個視覺上吸引人的等待/忙碌指示器?

如何在 Go 中為長時間運行的進程創建一個視覺上吸引人的等待/忙碌指示器?

Patricia Arquette
Patricia Arquette原創
2024-10-24 18:59:02784瀏覽

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

為執行的程序建立等待/忙碌指示器

執行子程序時,如提供的範例所示,提供向使用者提供視覺回饋,表明進程正在運行,特別是當執行時間可能很長時。這可以幫助防止用戶認為程式已凍結。

要建立等待/忙碌指示器,一種方法是利用 goroutine 在進程執行時定期列印某些內容。當進程完成時,可以向 goroutine 發送一個訊號來終止它。

這裡有一個程式碼範例示範了這種方法:

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

此程式碼使用一個程式碼來列印一個點每秒和一個關閉通道,用於在行程完成時向指示器goroutine 發出終止訊號。

要在每五個點後開始一個新行,請修改指示器函數,如下所示:

<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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn