为执行进程创建等待/忙碌指示器
在 Go 中执行子进程时,例如使用 exec.Command 安装 npm 包时,它可能需要很长时间才能看到输出。为了增强用户体验,请考虑显示一个忙碌指示器来指示该过程正在进行中。
解决方案:
一种有效的解决方案包括使用单独的 goroutine 定期当进程运行时,将字符(例如点)打印到控制台。当该过程完成时,指示器 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...") // 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>
为了获得更具视觉吸引力的指示器,您可以修改指示器函数以在特定数量的点后打印换行符,例如 5:
<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中文网其他相关文章!