Diferença entre as goroutines principais e as goroutines geradas de um programa Go
Ao criar um servidor usandogRPC
, se eu iniciar ogRPC
servidor no processo principal, ele pode lidar com até solicitações (milhares) de clientes. No entanto, se eu iniciar o servidor como uma goroutine, ele poderá lidar apenas com alguns pedidos (centenas) e depois ficar preso. Eu testei e confirmei isso com um exemplo muito simples, google.golang.org/grpc/examples/helloworld.
É porque o tamanho da pilha de goroutines geradas é muito pequeno (2Kbytes) e a goroutine principal é muito maior? Qual é a diferença entre as principais goroutinas e as geradas?
Exemploligação. Partes modificadas do exemplo da seguinte maneira.
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)
}
}
}