关注
【15】介绍下你的项目(之前答的很差,明明总结过两遍,还细细研究过,一个多月不看又忘的七七八八了,这里重新整理下):
1)
首先,最外层是线程池,是半同步/半反应堆线程池,这里的半同步/半反应堆的具体工作流程是,以 Proactor 为例:
主线程充当异步线程,如果 socket 上有事件发生,主线程读取后将数据封装成请求对象插入请求队列,然后请求队列上的工作线程,通过竞争获得任务接管权
这里通过一个工作队列,解除了主线程和工作线程的耦合关系
具体实现呢,有 5 部分,类定义,线程池的创建和回收,向请求队列添加任务,线程处理函数 work() 和 执行任务函数 run()
5 部分结合起来,就是常考的手撕线程池
2)
第二个呢,就是日志系统,项目中的日志系统是异步实现的,为什么不用同步呢,因为同步时,写入函数和工作线程是 串行的,当单条日志比较大,或者峰值的时候,写日志就会成为性能瓶颈。
而异步会将日志内容先存入阻塞队列,写线程先从阻塞队列取出内容,再写入,就可以避免阻塞。这里实际就是并发编程中经典的生产者/消费者模型,生产者线程和消费者线程共享同一个缓冲区,缓冲区底层是循环数组实现的阻塞队列。
3)
第三个就是定时器模块,可以定期检测非活跃连接,及时释放连接资源。
项目中,具体就是,服务器为每个连接创建一个定时器,定时器放在升序链表中,按超时时间升序排列,到期的定时器会从链表中删除,这里插入定时器的时间复杂度是O(n),删除的复杂度是O(1)
4)
第四个,http 连接的处理,也是本项目最复杂的一部分,整个项目约3000行代码,其中 http 的 .h 和 .cpp 两个文件,就占了800行
分 3 部分请求报文的读取,接收和响应
请求报文接收,涉及到对 http 报文格式和状态码的处理
解析部分,主要是主从状态机这个抽象模型
通过从状态机读取一行,然后由主状态机解析,分别对请求行,请求头和请求内容进行处理,其中解析请求头包含对GET的解析,解析请求内容,包含对POST的解析
响应部分,调用了sys/stat等多个头文件
5)
最后就是数据库连接池,类似前面提到的线程池,本质都是空间换时间,对资源的复用
项目中,使用局部静态变量的懒汉模式,来创建连接池
连接池的释放,通过 RAII 机制封装,避免了手动释放
查看原帖
点赞 1
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
- 1... 后端实习什么算有产出5.4W
- 2... 悟已往之不谏,知来者之可追1.3W
- 3... 以Mentor视角,更喜欢有这些沟通技巧的实习生1.3W
- 4... 来算一算你的offer究竟到手工资多少!(详细教程)9642
- 5... 双非本秋招字节转正失败春招重新拿下字节和腾讯8422
- 6... 就是说有些招聘要求别太离谱噢7635
- 7... 找实习、找工作中如何管理好自己的情绪?7327
- 8... 【26届四段大厂】实习爆炸产出方法论 2.06722
- 9... 腾讯云智一面面经6317
- 10... 暑期实习后,如何完成学生到职场人的身份转换?6106
正在热议
更多
# 我的求职总结 #
22386次浏览 427人参与
# 我的工作日记 #
95986次浏览 1261人参与
# 毕业季,给职场新人一些建议 #
18633次浏览 349人参与
# 晒一晒你收到的礼盒 #
61328次浏览 369人参与
# 我的实习日记 #
2431948次浏览 25369人参与
# 辞职之后最想做的一件事 #
9587次浏览 156人参与
# Offer比较,求稳定还是求发展 #
48628次浏览 235人参与
# 薪资一样,你会选择去大厂还是小公司 #
15795次浏览 99人参与
# 你想吐槽公司的哪些规定 #
16639次浏览 65人参与
# 选offer应该考虑哪些因素 #
16565次浏览 269人参与
# 你见过最离谱的招聘要求是什么? #
187842次浏览 1401人参与
# 机械人还在等华为开奖吗? #
216809次浏览 1097人参与
# 第一份工作应该只看薪资吗 #
138176次浏览 1455人参与
# 秋招想进国企该如何准备 #
57452次浏览 374人参与
# 为了秋招你都做了哪些准备? #
10429次浏览 160人参与
# 在国企工作的人,躺平了吗? #
327208次浏览 3841人参与
# 你怀疑过自己的专业选择吗? #
17099次浏览 201人参与
# 牛客十周岁生日快乐 #
129245次浏览 1516人参与
# 你想留在一线还是回老家? #
37382次浏览 446人参与
# 你小时候最想从事什么职业 #
90988次浏览 1700人参与