Fasthttp源码分析之http server源码分析

本文公众号文章链接:https://mp.weixin.qq.com/s/YZnWpWIRm1d0D_qOeLbqeQ

本文csdn博客链接:https://blog.csdn.net/screscent/article/details/79697992


Fasthttp源码分析之http server源码分析

Fasthttp是比标准库net/http还要快的http库。今天研究了下它http server的源码。

 

源码路径为:github.com/valyala/fasthttp

源码目录见文章最后。(因为目录太长,故放最后)

 

 

一、Server

先看下常规的实例用法。以下是README.md中的代码


 

那么就根据入口,进行源码跟踪。

github.com/valyala/fasthttp/server.go

 

 

继续跟踪Server结构体

 

上面看到了入口的Handler的定义

 

Server最后的成员来看,用了很多的资源池,这是其性能高的重要原因之一。

 

我们继续跟踪,Server函数

 

里面有两个很重要的地方。第一个红框中,有一个workerpool,这个就是其于总不同的地方。

其中有一个最重要的东西,就是s.serverConn。因为workerpool最后进入工作的函数就是它。

 

构建好workerpool之后,就启动了accept,并将其放入workerpool中进行工作。


在这里我们先直接进入到s.serverConn


 

关键代码如图中。在函数中,准备好了ctx之后,最终调用的是Handler。这个就是用户设置的Handler

到此逻辑已经终结了。

 

二、workerpool

分析完逻辑过程后,我们重点看看workerpool

github.com/valyala/fasthttp/workerpool.go

 

其中最重要的是WorkerFunc。这个是传入进行的任务。

还有一个最重要的是ready,它的类型为workerChan

 

workerChan里面保存了最后使用时间和传参用的net.Conn

 

根据流程逻辑,看看Start函数

 

这个函数,其实很简单,定时调用了clean,清理过期空闲的worker

 

clean代码就不过多解释了。

 

继续跟踪流程逻辑

 

Server函数,可以看到,获取workerChan,并将连接发送到chan

 

上面的代码中分为了两个部分,一个为从现有的worker重寻找空闲的进行发送c

如果没找到,则要看是否达到了上限有个标志位createWorker。如果没有达到上限,

则从workerChanPoolGet新的,

并开启了协程,执行wp.workerFunc

 

最后我们看看workerFunc函数,其实就是调用了wp.WorkerFunc。这个就是之前提到的工作任务。

 

 

 

龚浩华

月牙寂道长

QQ 29185807

20180326

 第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注


 

 

 

源码目录:

 

 


 

 



猜你喜欢

转载自blog.csdn.net/screscent/article/details/79697992