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?以及如何改善这种情况?
答案 0 :(得分:2)
我尝试了这样的例子,使用笔记本电脑上的所有8个CPU都可以正常工作
GOMAXPROCS=8 go run rpctest.go
所以猜测你搞砸了以某种方式设置GOMAXPROCS
环境变量。您是否将其设置在单独的一行并忘记导出它?
export GOMAXPROCS=8
通常我使用runtime模块
在程序中设置它runtime.GOMAXPROCS(runtime.NumCPU())