Внедрение Epoll на Голанге - PullRequest
0 голосов
/ 28 июня 2019

Я нашел эту библиотеку https://godoc.org/github.com/mailru/easygo/netpoll и пытаюсь заставить ее работать. После отправки простого http-запроса на 22222 у меня нависает навсегда, как и программа (я имею в виду, что зависание gorouting, но новые подключения принимаются). В консоли я вижу только «запуск» и ничего более. На самом деле он висит на ioutil.Readall , но я понятия не имею, почему. ReadAtLeast с 3 байтами тоже не работает.

Кто-нибудь успешно интегрирует этот lib или собственноручный epoll impl на golang? Мне это нужно для более быстрой обработки запросов http / socks, потому что профилирование говорит, что poll является узким местом!

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:

$ 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
...