Bei der Erstellung eines Servers mit gRPC
, wenn ich den gRPC
Server im Hauptprozess starten, kann es mit so vielen Anfragen (Tausende) von Clients umgehen. Wenn ich den Server jedoch als Goroutine starte, kann er nur einige Anfragen bearbeiten (Hunderte) und danach hängen bleiben. Ich habe das mit einem sehr einfachen Beispiel, google.golang.org/grpc/examples/helloworld, getestet und bestätigt.Unterschied zwischen der Haupt Goroutine und laiched goroutines eines Go-Programms
Liegt es daran, dass die Größe des Stacks der erzeugten Gauner sehr klein ist (2Kbytes) und die Haupt-Goroutine viel größer ist? Was ist der Unterschied zwischen der Haupt-Goroutine und den Laich-Gaunern?
Beispiel link. 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)
}
}
}
Sie sind die gleichen. Können Sie ein Beispiel zeigen, was genau Sie tun? – JimB
@ JimB Danke für die Antwort. Ich habe den Beispiellink und den modifizierten Code eingefügt. – v1ct0r
@Amd Es ist go1.7 linux/amd64 – v1ct0r