在 wg.wait() 完成后停止请求输入的选项

huangapple go评论97阅读模式
英文:

Option to stop asking for input after wg.wait() is done

问题

  1. 我触发了一个 goroutine(运行第三方程序),并且我正在使用 wg.Wait() 来等待它完成。

  2. wg.Wait() 之前,我想给用户提供一个选项,以便取消正在运行的第三方程序(如果他想要的话)。

  3. 在第三方程序执行完成后,这个用户输入选项应该消失(没有理由停止已经完成的进程)。目前,这个输入选项必须在触发 wg.Wait() 之前提供。

我该如何做呢?我考虑将 optiontoStop() 函数放在 goroutine 中,并在 wg.Wait() 完成后将其终止,但我无法完成这个操作。或者是否有一种方法可以在从 XYZ 返回之前向 scanf 的阻塞调用发送一个随机值?或者是否有其他的解决方法?

更多细节:

func XYZ() {
   wg.Add(1)
   go doSomething(&wg) // 这里运行一个第三方程序
}
func ABC() {
   XYZ()
   optiontoStop() // 我希望在第三方程序执行完成后,这个输入等待请求会消失
   wg.Wait() 
   // 其他一些操作
}
func optiontoStop() {
   var option string
   fmt.Println("如果你想退出程序,请输入 'quit'")
   fmt.Scanf("%s", &option)
   // 终止进程等操作
}
英文:

1. I triggered a goroutine (which runs a third party program) and I am using wg.Wait() to wait for it to complete

2. Before wg.Wait(), I want to provide user an option to cancel this third party program that is running (if he want to)

3. After the third party program execution is done, this user input option should vanish off (there is no reason why he should stop the process thats already done). Currently this input has to be provided before wg.Wait() is triggered

How can I do it? I thought of keeping the optiontoStop() function in goroutine and then kill it after wg.Wait() is done but I wasn't able to get it done or else is there a way to send a random value to the blocking call of scanf before I return from XYZ? or any other workarounds?

More details:

1.

func XYZ() {
   wg.Add(1)
   go doSomething(&wg) // this runs a third party program
}

2.

func ABC() {
   XYZ()
   optiontoStop() // I want this input wait request to vanish off after 
                  // the third party program execution                    
                  // (doSomething()) is completed
   wg.Wait() 
   //some other stuff 
}

3.

func optiontoStop() {
   var option string
   fmt.Println("Type 'quit'  if you want to quit the program")
   fmt.Scanf("%s",&string)
   //kill the process etc.
 }

答案1

得分: 3

你需要在另一个Go协程中处理用户输入,然后使用select语句替代wg.Wait()

func ABC() {
    done := make(chan struct{})
    go func() {
        defer close(done)
        doSomething()
    }()
    stop := make(chan struct{})
    go func() {
        defer close(stop)
        stop <- optionToStop()
    }()
    select {
    case <-done:
        // 完成,关闭optionToStop对话框,然后继续执行
    case <-stop:
        // 用户请求停止,终止第三方操作,然后继续执行
    }
}

请注意,我只提供了代码的翻译,不会回答关于翻译内容的问题。

英文:

You have to handle your user input in another Go routine, then instead of wg.Wait(), probably just use a select:

func ABC() {
    done := make(chan struct{})
    go func() {
        defer close(done)
        doSomething()
    }()
    stop := make(chan struct{})
    go func() {
        defer close(stop)
        stop &lt;- optionToStop()
    }
    select {
    case done:
        // Finished, close optionToStop dialog, and move on
    case stop:
        // User requested stop, terminate the 3rd party thing and move on
    }
}

huangapple
  • 本文由 发表于 2017年4月20日 03:08:22
  • 转载请务必保留本文链接:https://go.coder-hub.com/43504124.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定