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/