为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
九州编程 2021-07-15 17:01:33
package mainimport (    "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?以及如何改善这种情况?
查看完整描述

1 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

我像这样尝试了您的示例,并且在我的笔记本电脑上使用所有 8 个 CPU 都可以正常工作

GOMAXPROCS=8 go run rpctest.go

所以猜测你GOMAXPROCS以某种方式搞砸了设置环境变量。您是否将其设置在单独的行上并忘记导出它?

export GOMAXPROCS=8

通常我使用运行时模块在程序中设置它

runtime.GOMAXPROCS(runtime.NumCPU())


查看完整回答
反对 回复 2021-07-19
  • 1 回答
  • 0 关注
  • 210 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号