為執行的程序建立繁忙指示器
執行需要較長持續時間的子程序時,為使用者提供一種了解方式至關重要該進程確實正在運行。如果沒有指示器,使用者可能無法意識到進度,甚至認為系統已變得無響應。
為了解決此問題,可以實現各種忙碌指示器來向使用者提供視覺提示。其中一個指示器涉及定期將一個字元(例如點或進度條)列印到控制台。
使用 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中文網其他相關文章!