如何使用信号量来限制服务器的连接数,如何限制在 Go 中实现的 HTTP 服务器的连接数?...

这个技巧是实现你自己的net.Listener。我在这里有一个监听器示例(请参阅 waitConn 和 WaitListener),它跟踪连接(但不限制它们),您可以将其用作实现的灵感。它将被塑造成这样:

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

}

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.Listener.Accept (on error, release before returning)

// wrap LimitedConn

return c, nil

}

type LimitedConn struct { /* ... */ }

func (c *LimitedConn) Close() error {

/* ... */

c.sem

}

本质上,这样做是创建您自己的 net.Listener 实现,您可以将其提供给Serve,它仅在可以获取信号量时调用底层 Accept;如此获取的信号量仅在(适当包装的)net.Conn关闭时才释放。请注意,从技术上讲,这种信号量的使用对于 go1.2内存模型是正确的;在Go 的未来版本中,更简单的信号量将是合法的。