当前位置: 首页 > 面试题库 >

为执行的过程创建等待/忙碌指示器

公孙琛
2023-03-14
问题内容

我有执行子进程的程序

cmd := exec.Command("npm", "install")
log.Printf("Running command and waiting for it to finish...")
err := cmd.Run()
log.Printf("Command finished with error: %v", err)

运行此命令时,它会下载并安装npm软件包,这需要花费10到40秒的时间,并且用户直到看到标准输出(10-40秒取决于网络)才知道发生了什么,我可以做一些事情使用哪个可以在cli上打印一些东西,以便更清楚地说明发生了什么事情,一些忙碌的指示器(任何类型),直到将stdout打印到cli上?


问题答案:

您可以使用另一个goroutine定期(例如每秒)打印一些内容(例如点)。命令完成后,发出信号告知goroutine终止。

像这样:

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

如果要在每5个点之后开始新的一行,可以这样做:

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


 类似资料:
  • 问题内容: 我正在尝试编写一个脚本,该脚本在执行任务时将显示忙碌指示。任务结束后,进度条将填满,表明任务已完成100%。我只是希望进度条显示任务正在进行中,但是当我启动任务时,忙碌的指示停止了。在我看来,指示和任务无法一起继续进行。请帮我。这是mycode: 问题答案: 首先,直接编辑使用QtDesigner创建的代码是一个坏主意。您可能已经在文档顶部看到该行。对于这样一个简单的小部件,最好使用手

  • 我的问题在定义上有点挑剔: 下面的代码可以用“忙着等待”来形容吗?尽管它使用thread.sleep()来允许上下文切换? PS--维基百科目前对忙碌等待的定义表明,忙碌等待是一种“不太浪费”的形式。

  • 嗨,我正在做一个项目,我已经达到了我非常困的部分。我试图寻找方法来学习如何在繁忙的等待中编写 while 循环,但我没有找到任何东西,我的代码只是作为无限循环运行。有人可以帮助我解释一个繁忙的等待循环应该如何工作,并帮助我打破这个无限循环吗? 该项目希望做到以下几点:早上,学生醒来后(这需要一段随机的时间),他会去洗手间为新的上学日做准备。如果浴室已经客满,学生需要Rest一下(使用yield()

  • 问题内容: 我想知道退出程序之前等待go例程完成的正确方法是什么。阅读其他答案,看来bool chan可以解决问题,就像在Playground链接中一样 我在这里有两个问题: 为什么<-完成的作品完全可以? 如果我取消最后一行的注释会怎样?我有一个死锁错误。这是因为通道为空,并且没有其他函数向其发送值吗? 问题答案: 为何一切正常? 之所以有效,是因为运行时检测到您正在向其他地方的通道写入内容。

  • 我正在阅读Java中的TCP/IP套接字,关于服务器套接字,它说 当我们在该ServerSocket实例上调用接受()时,如果新连接挂起,接受()立即返回;否则它会阻塞,直到连接进入或计时器到期,以先到者为准。这允许单个线程处理多个连接。不幸的是,这种方法要求我们不断轮询所有I/O源,而这种“忙等待”方法再次引入了大量开销,因为循环遍历连接只是为了发现它们无事可做。 据我所知,当连接到来时,是否应

  • 我创建了一个小应用程序来下载youtube视频,并将它们添加到我的音乐文件夹中,这样我就可以通过spotify收听它们。只要我通过IDE运行该应用程序,它就可以正常工作。我创建了一个。exe文件通过pyinstaller,但它在启动时崩溃,我尝试以管理员身份运行它,也尝试按照其他线程中的建议通过cmd运行它,但没有任何效果。 我使用以下方法创建了它: 这是python代码: 这是我得到的,我试图通