golang 写了一个 Udp 服务端的程序,怎么改进支持多并发?

2015-10-19 16:12:07 +08:00
 zeroday
```go
package main

import (
"fmt"
"net"
"os"
"time"
)

func main() {
service := ":1200"
udpAddr, err := net.ResolveUDPAddr("udp4", service)
checkError(err)
conn, err := net.ListenUDP("udp", udpAddr)
checkError(err)
for {
handleClient(conn)
}
}
func handleClient(conn *net.UDPConn) {
var buf [512]byte
_, addr, err := conn.ReadFromUDP(buf[0:])
if err != nil {
return
}
daytime := time.Now().String()
conn.WriteToUDP([]byte(daytime), addr)
}
func checkError(err error) {
if err != nil {
fmt.Fprintf(os.Stderr, "Fatal error ", err.Error())
os.Exit(1)
}
}
```

试着用 `go` 关键字

```go
for {
go handleClient(conn)
}
```

引起系统 load average 过高到 400 over. 同时 client 只能响应一个请求。
6043 次点击
所在节点    问与答
3 条回复
sakeven
2015-10-19 19:24:34 +08:00
go handleclient
jjjabc
2015-10-19 20:27:09 +08:00
main 里面不要用 go ,在 handleClient 里面用
func handleClient(conn *net.UDPConn) {
var buf [512]byte
_, addr, err := conn.ReadFromUDP(buf[0:])
if err != nil {
return
}
go {
daytime := time.Now().String()
conn.WriteToUDP([]byte(daytime), addr)
}
}
jjjabc
2015-10-19 20:33:41 +08:00
回复能用 Markdown ?
```
func handleClient(conn *net.UDPConn) {
var buf [512]byte
_, addr, err := conn.ReadFromUDP(buf[0:])
if err != nil {
return
}
go {
daytime := time.Now().String()
conn.WriteToUDP([]byte(daytime), addr)
}
}
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/229237

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX