doulvyi2172 2016-08-01 05:48
浏览 27
已采纳

如何从客户端停止goroutine?

I need to create a html page which has two buttons, one will start a goroutine, which has an infinite loop, and other button need to break the infinite loop. As from my readings I understood that a goroutine can't be killed from outside it. Is there anyway to implement this? My code is as follows:

command := c.GetString("command") // from client to determine which button is clicked
quit := make(chan bool)
switch command {
    case "start":    // Button to start goroutine
        go func() {
            i := 0
            for {
                select {
                    case <- quit:
                        return
                     default:
                         fmt.Println("i: ", i)
                         i++
                         time.Sleep(3000 * time.Millisecond)
                 }
             }
         }()
     case "stop":    // Button to stop goroutine
         quit <- true
}
  • 写回答

1条回答 默认 最新

  • dpyln64620 2016-08-01 06:01
    关注

    You are already right about the design. An issue is that you are creating new channels each time you recieve a command. Which means there is no way to communicate with the previously started goroutine. You need to have a quit channel that stays in scope for between requests. Try something like below (untested):

    func listenForCommand() {
        var quit chan bool
    
        for {
            // command receiver, should fire for each command received
            command := c.GetString("command")
    
            switch command {
            case "start":
                if quit != nil {
                    continue
                }
                quit = make(chan bool)
                go func() {
                    i := 0
                    for {
                        select {
                        case <-quit:
                            return
                        default:
                            fmt.Println("i: ", i)
                            i++
                            time.Sleep(3000 * time.Millisecond)
                        }
                    }
                }()
            case "stop":
                if quit == nil {
                    continue
                }
                quit <- true
                close(quit)
                quit = nil
            }
        }
    }
    

    You can now call listenForCommand() to start listening for commands. This example presumes that there is another process populating c so c.GetString("command") returns a command if available, or blocks and waits for a command to arrive.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog