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())
- 1 回答
- 0 关注
- 210 浏览
添加回答
举报
0/150
提交
取消