我需要创建一个有两个按钮的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
}
答案 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")
返回命令(如果可用),或阻止并等待命令到达。