go - 为什么这个 RPC 服务器无法扩展?

标签 go

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 呢?那么如何改善这种情况呢?

最佳答案

我尝试了你的例子,它在我的笔记本电脑上使用所有 8 个 CPU 运行良好

GOMAXPROCS=8 go run rpctest.go

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

export GOMAXPROCS=8

通常我使用 runtime 在程序中设置它模块

runtime.GOMAXPROCS(runtime.NumCPU())

关于go - 为什么这个 RPC 服务器无法扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21362099/

相关文章:

ajax - 访问控制允许 Origin header 不存在于获取 API 调用中

git - 为团队构建 Go 子包

linux - 在 Go 中,为什么 "File.Readdirnames"会进行 "clock_gettime"系统调用?

处理程序中的 Golang 抽象以避免代码重复

python - 加载时找不到keras模型的输入层

go - 使用 channel 时出现问题 : all goroutines are asleep - deadlock

go - 如何获取 HTML 元素的内容

input - Golang - 检查参数数量?还有用户输入 - 检查返回键(空行)条目 ""

go - 删除集合firestore:go

go - 解析负载与 `serverless invoke local` 不同,然后在 APIGateway 后面部署时