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可以轻松实现基于网络的并发编程。