Go新手在这里,我知道默认情况下go午餐一个go例程来处理每一个传入的请求,有没有一种方法可以通过拥有一个工作池来控制grpc服务器中处理请求的go例程的数量?例如,我希望只拥有20个GR来处理请求,而不管传入请求的数量是多少。
type server struct{}
func (s *server) HandleRequest(ctx context.Context, in *pb.IncomingRequest) (*pb.Server.Response, error) {
//Do Something
return &pb.Server.Response{Message: "received request"}, nil
}
func main() {
lis, err := net.Listen("tcp", port)
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterMyServer(s, &server{})
log.Printf("Server listening at %v", lis.Addr())
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
2条答案
按热度按时间7rfyedvj1#
这是一个golang的工人池模式的例子。你应该在这个模式中定义你的工作。
zu0ti5jz2#
工人池最适合于那些需要昂贵初始化的任务,因此根据需要创建goroutine并不是最好的选择。
有多种方法可以限制使用通道的并发调用数量。当调用太多时,将立即返回以下内容:
另一个版本将所有请求排队,并最多并发处理
limit
: