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 關注
- 226 瀏覽
添加回答
舉報
0/150
提交
取消