看着net.TCPListener。考虑到 Go 并发范式,人们会期望将这个系统功能实现为通道,以便您chan *net.Conn从Listen()函数或类似的东西中获得 a 。
但似乎 Accept() 是一种方式,它只是阻塞,就像系统接受一样。除了它瘫痪了,因为:
没有合适的 select() 可以与它一起使用,因为 go 更喜欢频道
无法为服务器套接字设置阻塞选项。
所以我正在做类似的事情:
acceptChannel = make(chan *Connection)
go func() {
for {
rw, err := listener.Accept()
if err != nil { ... handle error ... close(acceptChannel) ... return }
s.acceptChannel <-&Connection{tcpConn: rw, .... }
}
}()
这样我就可以在一个选择中使用多个服务器套接字,或者将 Accept() 上的等待与其他通道复用。我错过了什么吗?我是 Go 的新手,所以我可能会忽略一些事情 - 但是 Go 真的没有用自己的并发范式实现自己的阻塞系统功能吗?我真的需要为我想听的每个套接字(可能是数百个或数千个)单独的 goroutine 吗?这是要使用的正确习语,还是有更好的方法?
暮色呼如
相关分类