簡體   English   中英

Go軟件包syscall conn.Read()是非阻塞的,並導致較高的CPU使用率

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM