如何从客户端停止goroutine?

时间:2016-08-01 05:48:25

标签: go goroutine

我需要创建一个有两个按钮的html页面,一个会启动一个goroutine,它有一个无限循环,而另一个按钮需要打破无限循环。从我的阅读中我了解到,goroutine不能从它外面被杀死。反正有没有实现这个?我的代码如下:

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 个答案:

答案 0 :(得分:1)

你对这个设计已经是正确的了。问题是每次收到命令时都要创建新通道。这意味着无法与之前启动的goroutine进行通信。您需要有一个quit通道,该通道保留在请求之间。尝试类似下面的内容(未经测试):

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

现在可以调用listenForCommand()开始侦听命令。此示例假定存在另一个填充c的进程,因此c.GetString("command")返回命令(如果可用),或阻止并等待命令到达。