gpt4 book ai didi

listen 和 serve 的 goroutine 会阻塞主进程的执行,永远不会到达以下用于通信的选择状态

转载 作者:数据小太阳 更新时间:2023-10-29 03:03:10 27 4
gpt4 key购买 nike

我仍然完全了解 goroutines 和 channel ,所以我可能会做一些明显错误的事情。我有一个运行 websocket 服务器和公共(public)路由的服务,用于将客户端从 https 升级到 wss。我正在尝试为其中一个例程附加一些拆卸代码,但第二个 go 调用似乎阻止了主函数的执行。我在启动时在控制台上到达 Println 5。我程序的其余部分运行得很愉快。我只是不能用 ctrl+C 杀死它(它也不需要在手动关闭后拆除)。

这是相关代码(完整的主文件减去了 streamAddr 变量和导入):

func main() {
fmt.Println(1)
flag.Parse()
log.SetFlags(0)

fmt.Println(2)
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, os.Interrupt)

fmt.Println(3)
hub := socktools.NewHub()
go hub.Run()

fmt.Println(4)
http.HandleFunc("/stream", func(w http.ResponseWriter, r *http.Request) {
socktools.ServeWs(hub, w, r)
})

fmt.Println(5)
go log.Fatal(http.ListenAndServe(*streamAddr, nil))

fmt.Println(6)

select {
case <-interrupt:
fmt.Println("Interrupt heard...")
close(hub.KillChan)
<-hub.KilledChan
fmt.Println("Ending main function")
return
}
}

为什么 go log.Fatal(http.ListenAndServe(*streamAddr, nil)) 阻塞?我以为 go 关键字立即使其异步?我在这里用错了吗?

最佳答案

你实际上是在调用 go log.Fatal(variable),所以异步调用是 log.Fatal,但它必须知道什么是 variable在那一刻,所以它首先必须调用 http.ListenAndServe 来查看返回的内容。但是 http.ListenAndServe block 。

你需要做的:

go func() {
log.Fatal(http.ListenAndServe(*streamAddr, nil))
}()

关于listen 和 serve 的 goroutine 会阻塞主进程的执行,永远不会到达以下用于通信的选择状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50282880/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com