Hi gophers,
I'm using netutil.LimitListener to limit the number of concurrent requests
that can be handled in a server to limit the memory usage of the service.
I've noticed that when I send a bunch of requests it serves the number
passed to the LimitListerner but after that it serves n-2 requests. I
wonder what the problem might be, not a big deal but maybe there is some
kind of problem in the library.
Here is the code that I've created to test this problem:
Server (waits 5 seconds before replying with concurrency limited to 10):
package main
import (
"golang.org/x/net/netutil"
"log"
"net"
"net/http"
"time"
)
type fooHandler struct {
}
func (fh *fooHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
time.Sleep(5 * time.Second)
w.Write([]byte("Done"))
}
func main() {
lis, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
lis = netutil.LimitListener(lis, 10)
fH := &fooHandler{}
s := &http.Server{
Handler: fH,
ReadTimeout: 60 * time.Second,
WriteTimeout: 60 * time.Second,
MaxHeaderBytes: 1 << 20,
}
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
Client (Sends 40 concurrent requests to the server):
package main
import (
"fmt"
"io/ioutil"
"net/http"
"sync"
)
func Ask(wg *sync.WaitGroup, n int) {
resp, err := http.Get("http://localhost:8080")
if err != nil {
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
fmt.Println(err, string(body), n)
wg.Done()
}
func main() {
wg := &sync.WaitGroup{}
for i := 0; i < 40; i++ {
wg.Add(1)
go Ask(wg, i)
}
wg.Wait()
}
In this example I see 10 responses after the first 5 seconds and then 8
responses every five seconds.
go version go1.8 darwin/amd64
Thanks,
Pablo
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.