猿问

为什么这个 RPC 服务器不能扩展?

package main


import (

    "fmt"

    "net"

    "net/rpc"

    "sync"

)


type SumInput struct {

    UpTo int

}

type SumOutput struct {

    Result int

}

type RpcServer struct {

}


func (s *RpcServer) Calculate(in *SumInput, out *SumOutput) error {

    for i := 0; i < in.UpTo; i++ {

        out.Result += i

    }

    return nil

}


func main() {

    server := new(RpcServer)

    rpc.Register(server)

    sock, err := net.Listen("tcp", ":1234")

    if err != nil {

        panic(err)

    }


    go func() {

        for {

            conn, err := sock.Accept()

            if err != nil {

                panic(err)

            }

            go rpc.ServeConn(conn)

        }

    }()


    wg := &sync.WaitGroup{}

    wg.Add(100)

    for i := 0; i < 100; i++ {

        go func(i int) {

            client, err := rpc.Dial("tcp", "127.0.0.1:1234")

            if err != nil {

                panic(err)

            }

            rpcOut := &SumOutput{}

            err = client.Call("RpcServer.Calculate", &SumInput{100000000}, rpcOut)

            if err != nil {

                panic(err)

            }

            fmt.Println("Got reply: ", rpcOut, i)

            wg.Done()

        }(i)

    }

    wg.Wait()

}

它并行启动 RPC 服务器和 100 个客户端,但它从不使用超过 1 个 CPU,尽管 GOMAXPROCS 已正确配置。


那么是什么阻止了它使用更多的 CPU?以及如何改善这种情况?


九州编程
浏览 211回答 1
1回答

跃然一笑

我像这样尝试了您的示例,并且在我的笔记本电脑上使用所有 8 个 CPU 都可以正常工作GOMAXPROCS=8&nbsp;go&nbsp;run&nbsp;rpctest.go所以猜测你GOMAXPROCS以某种方式搞砸了设置环境变量。您是否将其设置在单独的行上并忘记导出它?export&nbsp;GOMAXPROCS=8通常我使用运行时模块在程序中设置它runtime.GOMAXPROCS(runtime.NumCPU())
随时随地看视频慕课网APP

相关分类

Go
我要回答