Differenz zwischen der Hauptgoroutine und den gespawnten Goroutinen eines Go-Programms

Bei der Erstellung eines Servers mitgRPC, wenn ich das @ stargRPC server kann im Hauptprozess so viele Anforderungen (Tausende) von Clients verarbeiten. Wenn ich den Server jedoch als Goroutine starte, kann er nur einige Anforderungen (Hunderte) verarbeiten und bleibt dann hängen. Ich habe dies mit einem sehr einfachen Beispiel getestet und bestätigt: google.golang.org/grpc/examples/helloworld

Ist es, weil der Stapel der gespawnten Goroutinen sehr klein ist (2 KB) und die Hauptgoroutine viel größer? Was ist der Unterschied zwischen den Hauptgoroutinen und den hervorgebrachten Goroutinen?

BeispielVerknüpfun. Modifizierte Teile des Beispiels wie folgt:

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage