为执行的进程创建等待/忙碌指示器
执行子进程时,如提供的示例中所示,提供向用户提供视觉反馈,表明进程正在运行,特别是当执行时间可能很长时。这可以帮助防止用户认为程序已冻结。
要创建等待/忙碌指示器,一种方法是利用 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中文网其他相关文章!