英文:
Cannot assign requested address with golang and net/http packages
问题
我有一个用golang编写的服务器:
package main
import (
"fmt"
"net/http"
)
func hello(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(204)
fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
w.Header().Set("Connection", "close")
fmt.Println(r.Close)
}
func main() {
http.HandleFunc("/", hello)
http.ListenAndServe(":8080", nil)
}
然后我想用以下Python脚本快速测试它如何处理请求:
import requests
payload = "test"
while True:
r = requests.post("http://127.0.0.1:8080/test", data=payload)
r.connection.close()
经过多次循环后,它无法分配新的端口。我推断是我的服务器没有关闭连接(或者我的客户端)。
我应该如何在服务器端管理连接?
英文:
I have this server in golang :
package main
import (
"fmt"
"net/http"
)
func hello(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(204)
fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
w.Header().Set("Connection", "close")
fmt.Println(r.Close)
}
func main() {
http.HandleFunc("/", hello)
http.ListenAndServe(":8080", nil)
}
Then I wanted to try to quickly benchmark how it can handle requests whit this python script:
import requests
payload = "test"
while True:
r = requests.post("http://127.0.0.1:8080/test", data = payload)
r.connection.close()
After multiple loops it cannot assign new ports. I deduce that my server doesn't close connection (or my client).
How should I manage connection from server side?
答案1
得分: 1
你的端口即将用尽。
由于你在每个请求中设置了w.Header().Set("Connection", "close")
,每个请求都会使用一个全新的连接。如果你不想用尽端口,可以重用连接。
在你的客户端中,你关闭了整个连接池,这也会消耗更多的资源。调用r.close()
将连接返回给连接池,如果可能的话,它将被重用。即使响应很小,确保客户端消耗完整个响应体仍然是一个好的做法。如果服务器无法刷新其发送缓冲区,它也无法高效处理连接,并且关闭连接可能需要更长的时间。
英文:
You're running out of ports.
Since you're setting w.Header().Set("Connection", "close")
each request is going to take a new connection entirely. If you don't want to use up ports, re-use the connections.
In your client, you're closing entire connection pool, which also will use up more resources. Call r.close()
to return the connection to the pool and it will be reused if possible. Even though the response is small, it's still good practice to ensure the client consumes the entire response body. If the server can't flush its send buffers, it won't be able to efficiently handle the connections either, and it may take longer to close them.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论