首頁  >  文章  >  後端開發  >  如何使用 goroutine 為 Go 中長時間運行的進程建立繁忙指示器?

如何使用 goroutine 為 Go 中長時間運行的進程建立繁忙指示器?

Barbara Streisand
Barbara Streisand原創
2024-10-25 16:36:47284瀏覽

How to create busy indicators for long-running processes in Go using goroutines?

為執行的程序建立繁忙指示器

執行需要較長持續時間的子程序時,為使用者提供一種了解方式至關重要該進程確實正在運行。如果沒有指示器,使用者可能無法意識到進度,甚至認為系統已變得無響應。

為了解決此問題,可以實現各種忙碌指示器來向使用者提供視覺提示。其中一個指示器涉及定期將一個字元(例如點或進度條)列印到控制台。

使用 Goroutines 作為繁忙指示器

Goroutines 是輕量級線程Go 程式語言,可用於創建一個單獨的線程,負責管理繁忙指示器。以下是如何實現這一點:

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

在這個範例中,建立了一個名為indicator()的goroutine,它定期向控制台列印一個點。 Goroutine 繼續列印,直到從 shutdownCh 通道接收到訊號。當子進程完成時,主 Goroutine 關閉 shutdownCh,導致 Indicator() Goroutine 終止並停止列印點。

自訂 Busy Indicators

Busy Indicator 可以透過調整列印速率或添加不同的字元或圖案來進一步自訂。例如,要每秒列印一個點並在每5 個點後列印一個新行,可以如下修改Indicator() 函數:

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

透過在應用程式中合併繁忙指示器,您可以提供為用戶提供更快回應、用戶友好的體驗,確保他們在等待結果時進程正在後台執行。

以上是如何使用 goroutine 為 Go 中長時間運行的進程建立繁忙指示器?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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