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?以及如何改善这种情况?
跃然一笑
相关分类