Go语言 转到grpc服务器约束工作进程

4c8rllxm  于 2023-03-16  发布在  Go
关注(0)|答案(2)|浏览(116)

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

7rfyedvj1#

这是一个golang的工人池模式的例子。你应该在这个模式中定义你的工作。

package main

import (
    "fmt"
    "time"
)

func worker(id int, jobs <-chan int, results chan<- int) {
    for j := range jobs {
        fmt.Println("worker", id, "started  job", j)
        time.Sleep(time.Second)
        fmt.Println("worker", id, "finished job", j)
        results <- j * 2
    }
}

func main() {

    const numJobs = 5
    jobs := make(chan int, numJobs)
    results := make(chan int, numJobs)

    for w := 1; w <= 3; w++ {
        go worker(w, jobs, results)
    }

    for j := 1; j <= numJobs; j++ {
        jobs <- j
    }
    close(jobs)

    for a := 1; a <= numJobs; a++ {
        <-results
    }
}
zu0ti5jz

zu0ti5jz2#

工人池最适合于那些需要昂贵初始化的任务,因此根据需要创建goroutine并不是最好的选择。
有多种方法可以限制使用通道的并发调用数量。当调用太多时,将立即返回以下内容:

var limiter = make(chan struct{},limit)

func (s *server) HandleRequest(ctx context.Context, in *pb.IncomingRequest) (*pb.Server.Response, error) {
  select {
    case limiter<-struct{}{}:
      defer func() {
         <-limiter
      }()
    default:
      return nil,TooManyCalls
  }
  // Body
}

另一个版本将所有请求排队,并最多并发处理limit

func (s *server) HandleRequest(ctx context.Context, in *pb.IncomingRequest) (*pb.Server.Response, error) {
  limiter<-struct{}{}:
  defer func() {
      <-limiter
  }()
  // Body
}

相关问题