如何从客户端停止goroutine?

阿琼·阿吉斯(Arjun Ajith)

我需要创建一个具有两个按钮的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
}
Abhink

您已经对设计是正确的。问题是您每次收到命令时都在创建新通道。这意味着无法与先前启动的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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

并发客户端的Goroutine或锁

来自分类Dev

如何检测客户端停止在Firebase中监听?

来自分类Dev

如何停止在MongoDB Ruby客户端中登录?

来自分类Dev

如何检测停止在Firebase中监听的客户端?

来自分类Dev

heroku客户端停止工作

来自分类Dev

MQTT如何从客户端创建客户端?

来自分类Dev

如何在客户端发布期间停止服务器进程?

来自分类Dev

如果signalR服务器(WPF)意外停止,如何注销所有客户端?

来自分类Dev

EJB计时器:如何从客户端启动和停止EJB计时器?

来自分类Dev

如何测试Java SIP客户端?

来自分类Dev

客户端如何分割文件?

来自分类Dev

如何禁用Bit Torrent客户端

来自分类Dev

如何模拟客户端中止请求?

来自分类Dev

如何显示厨师客户端配置?

来自分类Dev

如何从客户端使用Twitter API?

来自分类Dev

如何展开客户端捆绑

来自分类Dev

如何从客户端角度处理CQRS

来自分类Dev

如何部署客户端git钩子?

来自分类Dev

客户端证书如何工作?

来自分类Dev

如何禁用XPage的客户端验证?

来自分类Dev

如何安装Minecraft(客户端)

来自分类Dev

套接字客户端如何setSoTimeout

来自分类Dev

如何模拟riak Java客户端?

来自分类Dev

OroCRM如何禁用客户端验证?

来自分类Dev

客户端如何更新数组

来自分类Dev

命名管道如何识别客户端

来自分类Dev

SpringMVC:如何过滤客户端的IP?

来自分类Dev

TcpListener如何获得连接的客户端?

来自分类Dev

如何从SimpleHTTPServer获取客户端IP