创建使用
例如link。将示例的修改部分如下。
gRPC
的服务器时,如果我在主进程中启动gRPC
服务器,它可以处理来自客户端的多达数千个请求。但是,如果我将服务器作为goroutine启动,则只能处理一些请求(数百个),然后陷入停顿。我已经使用非常简单的示例进行了测试和确认,google.golang.org/grpc/examples/helloworld。
这是因为生成的goroutine堆栈大小非常小(2Kbytes),而主goroutine的堆栈要大得多吗?主goroutine和生成的goroutine之间有什么区别?例如link。将示例的修改部分如下。
greeter_server/main.go
func main() {
go func() {
lis, err := net.Listen("tcp", port)
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterGreeterServer(s, &server{})
s.Serve(lis)
}()
for {
}
}
greeter_client/main.go
func main() {
// Set up a connection to the server.
for i := 0; i < 500; i++ {
conn, err := grpc.Dial(address, grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewGreeterClient(conn)
for i := 0; i < 500; i++ {
// Contact the server and print out its response.
name := defaultName
if len(os.Args) > 1 {
name = os.Args[1]
}
r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("%d's Greeting: %s", i, r.Message)
}
}
}
select{}
,但通常情况下并不需要。 - JimB