【发布时间】:2018-08-14 15:43:40
【问题描述】:
我有一个使用 goroutine 读取 UDP 数据包的 go 程序。 我想使用一个 select 子句和一个“停止”通道来关闭 goroutine,以便在不再需要它时立即关闭。
下面是 goroutine 的一个简单代码示例:
func Run(c chan string, q chan bool, conn *net.UDPConn) {
defer close(c)
buf := make([]byte, 1024)
for {
select {
case <- q:
return
default:
n, _, err := conn.ReadFromUDP(buf)
c <- string(buf[0:n])
fmt.Println("Received ", string(buf[0:n]))
if err != nil {
fmt.Println("Error: ", err)
}
}
}
}
连接被创建为:
conn, err := net.ListenUDP("udp",addr.Addr)
goroutine 应该通过以下方式终止:
close(q)
关闭“停止”通道(“q”)后,goroutine 不会立即停止。我需要通过 UDP 连接再发送一个字符串。当这样做时,goroutine 停止。 我根本不理解这种行为,如果有人能启发我,我将不胜感激。
提前谢谢你!
【问题讨论】:
-
你尝试关闭连接了吗?
-
建议关闭您打开它们的频道。
defer声明是为了促进这种行为(同时打开和关闭,这样你就不会忘记关闭)。这也可能是您观察到的行为的影响因素 -
@NorbertvanNobelen:不,关闭通道不是清理操作,您不需要关闭它们,关闭它们通常是不正确的。
-
@JimB 我的评论是关于在同一位置打开和关闭,而不是在两个不同的功能中。由于延迟关闭不是在创建通道时,因此呈现的代码可能会令人困惑。