Golang中如何实现网络并发?代码举例讲解

Golang通过goroutine和channel特性,可以非常轻松地实现网络并发。代码示例:

TCP 服务器:

go
listener, err := net.Listen("tcp", ":8000")
if err != nil {
    log.Fatal(err)
}

// 创建goroutine池
pool := make(chan int, 10) 
for i := 0; i < 10; i++ {
    pool <- i
}

for {
    conn, err := listener.Accept()
    if err != nil {
        log.Fatal(err)
    }

    // 从goroutine池中取出一个goroutine来处理连接
    go func(c net.Conn) {
        defer func() {
            <-pool  // 处理完毕后将goroutine放回池中
        }()
        handleConnection(c)
    }(conn)
}

func handleConnection(conn net.Conn) {
    // ...
}

在服务器端,我们创建了一个含有10个goroutine的池。每当有新连接时,就从池中取出一个goroutine来处理,处理完毕后再放回池中,这样可以重复利用固定数量的goroutine来处理并发连接。

TCP 客户端:

go
conn1, err := net.Dial("tcp", "localhost:8000")
if err != nil {
    log.Fatal(err)
}  

conn2, err := net.Dial("tcp", "localhost:8000")
if err != nil {
    log.Fatal(err)
}

go func() {
    handleConn(conn1) 
}()

go func() {
    handleConn(conn2)
}()

在客户端,我们为每个连接创建一个goroutine来并发处理,这样可以实现同时连接到服务器多个客户端的效果。

Golang通过goroutine和channel可以轻松实现基于网络的并发编程。