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)
        }
    }
}

questionAnswers(1)

yourAnswerToTheQuestion