我正在尝试在Golang中实现HTTP服务器。
我的问题是,我必须在任何特定时间将最大活动连接数限制为20。
如果您不想实现自己的包装器,则可以使用netutil.LimitListener
函数来包装netutil.LimitListener
:-
net.Listener
技巧是实现自己的connectionCount := 20
l, err := net.Listen("tcp", ":8000")
if err != nil {
log.Fatalf("Listen: %v", err)
}
defer l.Close()
l = netutil.LimitListener(l, connectionCount)
log.Fatal(http.Serve(l, nil))
。我有一个侦听器net.Listener(请参见waitConn和WaitListener)的示例,该示例跟踪连接(但不限制连接),您可以将其用作实现的灵感。形状将如下所示:
here
本质上,这是创建您自己的net.Listener实现,您可以将其提供给type LimitedListener struct {
sync.Mutex
net.Listener
sem chan bool
}
func NewLimitedListener(count int, l net.Listener) *net.LimitedListener {
sem := make(chan bool, count)
for i := 0; i < count; i++ {
sem <- true
}
return &net.LimitedListener{
Listener: l,
sem: sem,
}
}
func (l *LimitedListener) Addr() net.Addr { /* ... */ }
func (l *LimitedListener) Close() error { /* ... */ }
func (l *LimitedListener) Accept() (net.Conn, err) {
<-l.sem // acquire
// l.Listener.Accept (on error, release before returning)
// wrap LimitedConn
return c, nil
}
type LimitedConn struct { /* ... */ }
func (c *LimitedConn) Close() error {
/* ... */
c.sem <- true // release
}
,该实现仅在获得信号量时才调用底层的Accept;仅在(适当包装的)Serve关闭时释放如此获取的信号量。请注意,从技术上讲,信号量的使用相对于go1.2 net.Conn是正确的;在Go的memory model中,更简单的信号量将是合法的。
借助渠道,您可以限制活动连接的数量。
1。在服务器启动时,创建一个通道并将相等数量的极限计数(在您的情况下为20)值放入该通道。
2。在处理一个请求时从通道中删除一个值。
网络上的一个例子
future versions