fasthttp 是如何启动 goroutine 来处理请求的

首先,在 fasthttp 中大量的使用了 sync.Pool 来缓存某些对象,已达到对象复用、减小 GC 压力的目的。 fasthttp 并不像官方 net/http 一样,创建一个 gorountine 来处理一个 http 请求,而是创建可复用的 gorountine ,并且数量会随着负载的大小伸缩。

查看自动伸缩如何实现的

fasthttp.ListenAndServe 入手:

func (s *Server) ListenAndServe(addr string) error {
   
    ln, err := net.Listen("tcp4", addr)  // 创建 Listen 对象用于监听端口创建tcp连接
    ...
    return s.Serve(ln)
}
...

func (s *Server) serveConn(c net.Conn) (err error) {
   
    // 初始化 ctx(RequestCtx)
    // 执行请求处理器
}

func (s *Server) Serve(ln net.Listener) error {
   
    ....
    var c net.Conn
    var err error

    maxWorkersCount := s.getConcurrency()

    ....

    wp := &workerPool{
            // 这个就是实现 自动伸缩功能的主体
        WorkerFunc:      s.serveConn,
        MaxWorkersCount: maxWorkersCount,
        LogAllErrors:    s.LogAllErrors,
        Logger:          s.logger(),
        connState:       s.setState,
    }
    wp.Start()   // 初始化 workerPool 并开始 循环清理 workerPool
    ...

    for {
   
        if c, err = acceptConn(s, ln, &lastPerIPErrorTime); err != nil {
      // 监听 并得到一个TCP链接
           ...
        }
        ...

        if !wp.Serve(c) {
       // 交由 wp 对象处理
            // 无法处理请求(并发数达到上限)的一些处理代码
            ...
        }
        c = nil
    }
}

// ---------------------------------------
//                workerpool.go
// ---------------------------------------
...
func (wp *workerPool) Start
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值