我找到了这个库https://godoc.org/github.com/mailru/easygo/netpoll,并试图使其正常运行。在22222上发送一个简单的http请求后,我将永远挂起,以及一个程序(我是说gorouting正在挂起,但接受了新的连接)。在控制台上,我仅看到“正在启动”,仅此而已。实际上,它挂在 ioutil.Readall 上,但是我不知道为什么。具有3个字节的ReadAtLeast也不起作用。
有人能在golang上成功集成此lib或手写epoll impl吗?我需要它来更快地处理http / socks请求,因为分析表明民意调查是瓶颈!
go版本go1.12.6 linux / amd64
l, _ := net.Listen("tcp", ":22222")
defer l.Close()
poller, _ := netpoll.New(nil)
for {
conn, _ := l.Accept()
go func(conn net.Conn) {
desc := netpoll.Must(netpoll.HandleRead(conn))
poller.Start(desc, func(ev netpoll.Event) {
fmt.Println("starting")
if ev&netpoll.EventReadHup != 0 {
poller.Stop(desc)
conn.Close()
return
}
b, _ := ioutil.ReadAll(conn)
fmt.Println(string(b))
})
}(conn)
}
以下是卷曲输出:
$ curl http://127.0.0.1:22222 -d "xxx" -v
* Rebuilt URL to: http://127.0.0.1:22222/
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 22222 (#0)
> POST / HTTP/1.1
> Host: 127.0.0.1:22222
> User-Agent: curl/7.58.0
> Accept: */*
> Content-Length: 3
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 3 out of 3 bytes