Yes. Go uses “green threads” with its own scheduler and uses facilities like 
epoll under the covers. 

> On Apr 6, 2022, at 8:43 AM, 'Jack Li' via golang-nuts 
> <golang-nuts@googlegroups.com> wrote:
> 
> 
> Hi group,
> 
> I am going through this page: https://studygolang.com/articles/22820 , It 
> claims that the 50 lines of Go code handles 1 million concurrent connections 
> from network clients, on 1 single server machine with a 4-Core CPU and 16G 
> memory.
> 
> Does the package net already utilize IO Multiplexing internally, like epoll 
> (epoll_create, epoll_ctl, epoll_wait)? So I can just use package net and gain 
> the epoll ability automatically without calling epoll apis manually in Go?
> 
> Thanks
> 
> Server:
> ```
> package main
> 
> import (
>     "fmt"
>     "net"
>     "os"
>     "time"
> )
> 
> var array []byte = make([]byte, 10)
> 
> func checkError(err error, info string) (res bool) {
> 
>     if err != nil {
>         fmt.Println(info + "  " + err.Error())
>         return false
>     }
>     return true
> }
> 
> func Handler(conn net.Conn) {
>     for {
>         _, err := conn.Write(array)
>         if err != nil {
>             return
>         }
>         time.Sleep(10 * time.Second)
>     }
> }
> 
> func main() {
> 
>     for i := 0; i < 10; i += 1 {
>         array[i] = 'a'
>     }
> 
>     service := ":8888"
>     tcpAddr, _ := net.ResolveTCPAddr("tcp4", service)
>     l, _ := net.ListenTCP("tcp", tcpAddr)
> 
>     for {
>         conn, err := l.Accept()
>         if err != nil {
>             fmt.Printf("accept error, err=%s\n", err.Error())
>             os.Exit(1)
>         }
>         go Handler(conn)
>     }
> 
> }
> ```
> 
> Client:
> 
> ```
> package main
> 
> import (
>     "flag"
>     "fmt"
>     "net"
>     "os"
>     "time"
> )
> 
> var RemoteAddr *string
> var ConcurNum *int
> var LocalAddr *string
> 
> func init() {
>     RemoteAddr = flag.String("remote-ip", "127.0.0.1", "ip addr of remote 
> server")
>     ConcurNum = flag.Int("concurrent-num", 100, "concurrent number of client")
>     LocalAddr = flag.String("local-ip", "0.0.0.0", "ip addr of remote server")
> }
> 
> func consume() {
> 
>     laddr := &net.TCPAddr{IP: net.ParseIP(*LocalAddr)}
> 
>     var dialer net.Dialer
>     dialer.LocalAddr = laddr
> 
>     conn, err := dialer.Dial("tcp", *RemoteAddr+":8888")
>     if err != nil {
>         fmt.Println("dial failed:", err)
>         os.Exit(1)
>     }
>     defer conn.Close()
> 
>     buffer := make([]byte, 512)
> 
>     for {
>         _, err2 := conn.Read(buffer)
>         if err2 != nil {
>             fmt.Println("Read failed:", err2)
>             return
>         }
> 
>         //  fmt.Println("count:", n, "msg:", string(buffer))
> 
>     }
> 
> }
> 
> func main() {
>     flag.Parse()
>     for i := 0; i < *ConcurNum; i++ {
>         go consume()
>     }
>     time.Sleep(3600 * time.Second)
> }
> ```
> -- 
> You received this message because you are subscribed to the Google Groups 
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to golang-nuts+unsubscr...@googlegroups.com.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/golang-nuts/tencent_BEE3D2499F3C9358D7A1CD7C88E0228C6D07%40qq.com.

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/DF3ECA69-BFD3-48B8-8EF1-CF8E538EEA20%40ix.netcom.com.

Reply via email to