[英]Go package syscall conn.Read() is non-blocking and cause high CPU usage
奇怪的是,在我的情況下, Read()
是非阻塞的,並導致較高的CPU使用率。
我的代碼:
在功能main
:
l, err := net.Listen("tcp", ":13798")
if err != nil {
log.Fatal(err)
}
for {
// Wait for a connection.
conn, err := l.Accept()
if err != nil {
log.Fatal(err)
}
// Handle the connection in a new goroutine.
// The loop then returns to accepting, so that
// multiple connections may be served concurrently.
go reqHandler.TCPHandler(conn)
runtime.Gosched()
}
功能TCPHandler
:
func TCPHandler(conn net.Conn) {
request := make([]byte, 4096)
for {
read_len, err := conn.Read(request)
if err != nil {
if err.Error() == "use of closed network connection" {
LOG("Conn closed, error might happened")
break
}
neterr, ok := err.(net.Error);
if ok && neterr.Timeout() {
fmt.Println(neterr)
LOG("Client timeout!")
break
}
}
if read_len == 0 {
LOG("Nothing read")
continue
} else {
// do something
}
request := make([]byte, 4096)
}
}
問題是conn.Read()
是非阻塞的,因此每次進入LOG("Nothing read")
然后繼續執行時,這會導致CPU使用率很高。 如何使conn.Read()
成為塊調用?
我已經研究了syscall
軟件包,但被卡在Syscall.Read()
因為我在OS X 10.8.3上發現了此問題,這里是與源代碼有關的:
http://golang.org/src/pkg/syscall/zsyscall_darwin_amd64.go?h=Read#L898
我不知道Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))
含義。
您沒有正確處理TCP。 當conn.Read()返回讀取的0個字節時,這意味着對等方已正常關閉TCP連接。 在這種情況下,您可能應該關閉TCP連接的末端。
(請注意,這對Go而言並不特殊,在TCP連接上read()/ recv()或多或少地返回0表示另一端已關閉該連接)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.