我需要创建一个具有两个按钮的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
}
您已经对设计是正确的。问题是您每次收到命令时都在创建新通道。这意味着无法与先前启动的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")
返回一个命令(如果可用),或者阻塞并等待命令到达。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句