V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zeroday
V2EX  ›  问与答

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

  •  
  •   zeroday · 2015-10-19 16:12:07 +08:00 · 6057 次点击
    这是一个创建于 3350 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 关键字

    for {
            go handleClient(conn)
        }
    

    引起系统 load average 过高到 400 over. 同时 client 只能响应一个请求。

    3 条回复    2015-10-19 20:33:41 +08:00
    sakeven
        1
    sakeven  
       2015-10-19 19:24:34 +08:00 via iPhone
    go handleclient
    jjjabc
        2
    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
        3
    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)
    }
    }
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2026 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 81ms · UTC 00:33 · PVG 08:33 · LAX 16:33 · JFK 19:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.