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