我有一个监听 TCP 连接的 go-routine,并在通道上将这些连接发送回主循环。我在 go-routine 中执行此操作的原因是使此侦听非阻塞并能够同时处理活动连接。
我已经使用带有空默认情况的 select 语句实现了这一点,如下所示:
go pollTcpConnections(listener, rawConnections)
for {
// Check for new connections (non-blocking)
select {
case tcpConn := <-rawConnections:
currentCon := NewClientConnection()
pendingConnections.PushBack(currentCon)
fmt.Println(currentCon)
go currentCon.Routine(tcpConn)
default:
}
// ... handle active connections
}
这是我的 pollTcpConnections 例程:
func pollTcpConnections(listener net.Listener, rawConnections chan net.Conn) {
for {
conn, err := listener.Accept() // this blocks, afaik
if(err != nil) {
checkError(err)
}
fmt.Println("New connection")
rawConnections<-conn
}
}
问题是我从来没有收到过这些联系。如果我以阻塞方式执行此操作,如下所示:
for {
tcpConn := <-rawConnections
// ...
}
我收到了连接,但它阻塞了......我也尝试过缓冲通道,但同样的事情发生了。我在这里想念什么?