加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

这是在golang中终止goroutine的正确方法吗?

发布时间:2020-12-16 09:26:00 所属栏目:大数据 来源:网络整理
导读:我正在构建一个需要启动自己的HTTP服务器的命令行应用程序. 我的想法是在我的主程序中的goroutine中启动http服务器,如下所示: func main() { go myserver() // perform lots of time-consuming tasks}func myserver() { s := http.Server{ Addr: ":8080",Ha
我正在构建一个需要启动自己的HTTP服务器的命令行应用程序.
我的想法是在我的主程序中的goroutine中启动http服务器,如下所示:

func main() {
    go myserver()

    // perform lots of time-consuming tasks
}

func myserver() {
    s := &http.Server{
        Addr: ":8080",Handler: MyHandler{},}
    log.Fatal(s.ListenAndServe())
}

>我的主要功能需要能够告诉goroutine死亡.由于Web服务器在ListenAndServe方法上阻塞,因此无法通过sync.WaitGroup或通道发送信号.
>我的一个想法是向网络服务器发出HTTP POST,并要求它在收到特定的约定价值时自杀.

是否有其他替代方案是golang的惯用语?

解决方法

如果在程序退出之前运行Web界面,则可以从主线程返回.即使另一个goroutine正在工作,从主线程返回退出程序.如果您希望主线程将kill发送到http服务器,最好的方法是关闭侦听器.

func main() {
    l,err := net.Listen("tcp",":8080")
    if err != nil {
        log.Fatal(err)
    }
    go myserver(l)

    // perform lots of time-consuming tasks

    l.Close()
}

func myserver(l net.Listener) {
    s := &http.Server{
        Addr:    ":8080",}
    log.Print(s.Serve(l))
}

这不会关闭已经打开的连接.它只会阻止创建新的.您需要向处理程序添加逻辑和/或停止keep-alives以确保在您终止侦听器后很长时间不会重用连接.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读