博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go-fasthttp源码分析
阅读量:7154 次
发布时间:2019-06-29

本文共 1044 字,大约阅读时间需要 3 分钟。

  hot3.png

架构

listener->server->workerpool

workerpool中有两种缓存:

  • wp.ready,缓存未退出worker,

  • worker退出后用sync.pool缓存channel

worker就是工作协程,它的存活期由maxIdleWorkerDuration控制,因此每次使用后都用lastUseTime记录。 workerpool每maxIdleWorkerDuration时间会使用“least recently used”策略清理掉空闲时间超过maxIdleWorkerDuration的,因为ready是按使用顺序排的(每次worker执行完workerFunc会append到最后),因此只要找到第一个时间超过maxIdleWorkerDuration的,把它和之前的workerChan都停掉、置nil即可。

  • 问题:为什么有了worker的缓存,还需要缓存channel?

回答:fasthttp号称“Zero memory allocations in hot paths”,channel的make也算是allocation,可能也会耗时吧。

listener可以是net.Listen生成,也可以是reuseport.Listen生成,对多核机器性能表现更好。

解码

把server.ServeConn()作为workerpool的WorkerFunc传给worker

s.serveConn(c)主要就是从pool中取一个ctx,然后用bufio.Reader|bytePool封装conn,然后http request.readLimitBody

通过b, err := r(bufio.Reader).Peek(n)来每次重新header.Parse(b),从请求行开始解析,最终readRawHeaders读到两个\n,再一股脑拷贝到RequestHeader.rawHeaders中。

  • 问题:为什么不用bufio.Reader.ReadBytes([]byte("\r\n\r\n"))直接读到headers结束呢?

回答:Peek是返回bufio.Reader.buffer的slice,没有memory allocation,比ReadBytes性能要好。

  • 问题:为什么不直接连续Peek到两个\r\n就结束?

回答:这段代码就是这个思路。

转载于:https://my.oschina.net/chuqq/blog/1574533

你可能感兴趣的文章
Java并发编程:阻塞队列
查看>>
Construct Binary Tree from Inorder and Postorder Traversal
查看>>
USMT
查看>>
第二次作业
查看>>
是否是丑数
查看>>
txt1-txt2去重输出到txt3
查看>>
iOS 多线程
查看>>
linux 0.11 源码学习(六)
查看>>
15061009-第0次作业(阅读与感想)
查看>>
C++ Rule of Three
查看>>
PHP——AJAX的资料:
查看>>
push 和 append 以及appendchild 用法和区别
查看>>
mysql主要应用场景 转载
查看>>
listview重新计算高度
查看>>
Bootstrap+PHP表单验证实例
查看>>
MySQL实现嵌套集合模型
查看>>
Windows Server 2008服务器上测试几个站点,改完host居然没有生效
查看>>
SQL Server中LIKE和PATINDEX的用法
查看>>
seek()对中文偏移测试
查看>>
爱她就用python给她画个小心心 ♥(ˆ◡ˆԅ)
查看>>