使用Sender和io_uring改造Webserver

news/2025/10/12 23:26:14/文章来源:https://www.cnblogs.com/123789456ye/p/19137500

前言

我以前有写过一个练手玩具,参考 tinywebserver
当然那时候我稍微改了下,改成了主从 Reactor 和 epoll
不过那时候感觉最后实现的有线程问题,查了半天没查出来红温了,索性加了一把大锁
最近读了下 Sender 模型,正好之前也写了个 coroutine primitive,于是拿来练手

参考资料

虽然 C++26 上通过了 execution,但是参考资料还是非常非常少
由于我还是想从底层开始,所以不考虑网络库(不如说用网络库就没什么工作量了),直接从标准的 stdexec 开始
阅读前,需要先对网络编程,异步,IO,以及最好对协程有一些了解
提案就不放了,太长了我也没仔细看
参考之一:execution 的设计
参考之二:execution 的构造例(这是系列最后一篇)
参考之三:重点,我写的也是基于这个封装(另外,这个作者也是上面那个翻译者,有点巧了)

上述参考中有一些引用,建议都先看一看,毕竟参考资料太少了
gpt 和 claude 的支持都不怎么样,这个时候建议直接把觉得不错的参考代码喂给 ai
由于终版的 P2300 提案中已经去掉了 tag_invoke,改成了成员函数,读源码时需要适当注意下,目前 stdexec 中应该是两种都有?

关于io_uring,看起来虽然只有三个 syscall,但是结合多线程会出现非常多神秘问题,所以就不用裸的,统一用liburing

改写目标

基本上我们要改写的部分是:threadpool 和 HTTP connection,分别对应两个部分
但是由于 execution 提出了非常神的 context 这一概念,我们实际上需要首先写个 scheduler,然后基于这个去写 sender
异步IO的部分,原则上也是需要包在 sender 里的,所以又回来了
我之前读各种资料和源码,读了差不多5天,一直下不去手,后面读到那篇 blog 才好起来

一些注意的地方

首先需要熟悉 sender 这一套方法,sender factory {| sender adaptor} | sender consumer
sender factory 的话,基本上就是 just 或者 schedule(scheduler) 起手
中间是若干个处理,注意执行流程其实就是里面的 lambda,写起来和同步是一样的,基本上就是 let_value 或者 then
最后的 consumer,理论上全局只要写一个 sync_wait 就行了
如果需要循环可以直接 return false 然后接 repeat_effect_until
然而如果报错了,就有早年模板元报错的美了,还加上了 lambda closure 的美,不过总之现代报错都有行标和颜色,只读 error 读起来也能读

实现

关于服务器本身倒没什么好讲的,毕竟 parser 之类的代码都能复用
我还稍微改了下写路径,因为都是静态资源,所以可以直接走 sendfile
这里花了一天多一点
先是写了个基于线程池的版本,然后想一想我都写 sender 了怎么还在显式线程池,这不对吧
于是改了下,改成每个线程有独立的 io_uring 示例,约等于重写,花了两天
然后发现 Ctrl+C 停不下来,于是仔细研读那篇 blog,又适当的重写了一部分才修好
到这里花了两天,基本功能都有了
压测发现到10k并发的时候会出现大量的失败,加了个最大连接数限制后好一点但不多,懒得修了
然后准备加上 timer 和 keep-alive,又花了一天,
之后准备实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/935793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

乐理 -04 打拍子

.. 四N拍子 打拍子.....附点小切分 强的在中间大附点&大切分八N拍子 打拍子 3个

如何在Renpy尝试中调整人物和背景图像大小

在初步绘制好立绘或者是背景后,如果直接存入images文件中进行图像调用,往往会出现图像过于大或者是过于小,导致当前场景观感不佳等问题。 解决方案主要有两种: (1)重新选择较大或者是较小的画布,重新绘制立绘,…

开源软件站

1. OSCHINA - 中文开源技术交流社区 https://www.oschina.net/2. 开源软件 - Gitee.com3. Trending repositories on GitHub today GitHub4. Explore projects GitLab5. GitCode - 全球开发者的开源社区,开源代码托…

如何安装claude code以及ccr code

如何安装claude code以及ccr code 1. 安装 node 1.1 node的常规安装(适用于linux18.04,linux20.04等新版本) 参考官网安装顺序:https://nodejs.org/en/download 1.2 常规安装失败,其他情况下node的安装(适用于li…

代码托管平台

1. 开源软件 - Gitee.com2. Trending repositories on GitHub today GitHub3. Explore projects GitLab4. GitCode - 全球开发者的开源社区,开源代码托管平台5. 腾讯Coding 2025年10月12日停止注册,推荐CNB - Cloud…

209. 长度最小的子数组 滑动窗口+暴力

209. 长度最小的子数组 滑动窗口 思路 初始化滑动窗口的起始位置 left = 0、终止位置 right = 0。 外循环先确定滑动窗口的终止位置(增大滑动窗口),找到符合条件的子序列, 根据当前子序列元素和大小的情况,在内循…

CISA事件响应实战经验:漏洞修复与应急响应关键教训

美国网络安全和基础设施安全局分享了一起联邦机构遭攻击事件的技术分析,详细介绍了攻击者利用GeoServer漏洞的入侵过程、横向移动技术,并总结了漏洞修复、应急响应计划和日志监控三个关键教训。执行摘要 CISA在美国联…

机器人视觉系统在复杂环境中的自主决策与学习

本文介绍了某中心研发的Robin机器人视觉系统,该系统通过机器学习技术实现复杂场景下的物体识别与抓取决策,具备持续学习能力,能够从错误中自动学习并提升分拣准确率,展示了机器人感知系统在生产环境中的实际应用。…

2025开关按钮厂家最新权威推荐榜:品质卓越与创新设计的行业

2025开关按钮厂家最新权威推荐榜:品质卓越与创新设计的行业随着工业自动化和智能化的发展,开关按钮作为关键的控制元件,在各个行业中扮演着越来越重要的角色。为了帮助筛选开关按钮品牌,特此发布权威推荐榜单,为采…

正睿25noip十连测day5

题面:今天有点 fvv,只是 \(110pts,rk124\)。 T1 这道题是签到题,显然不用说。 T2 这道题比较难想。 我们先考虑这个给的数据范围啥意思。 \(2e5\) 大概率是 \(\mathcal{O}(n)\) 或 \(\mathcal{O}(n\log n)\)。 然后…

记录一下 WPF进程 SendMessage 发送窗口消息进行进程间通信,存在进程权限无法接受消息的问题

前言 最近在接手一个前同事写的WPF项目,是使用.NetFramwork 开发的,使用的进程间通信没有使用我们之前封装的基于WebSocket的封装组件的,而是使用Win32的方式:发送端用的Windows Api:SendMessage ,接受端使用的是…

kettle插件-dm数据库插件,解决kettle9.X版本无法连接数据库资源库问题

场景: 上周四一位小伙伴发出求助,周末有时间一起看下如何解决此问题,信息如下: 用 pdi(kettle)9.2 和 9.4 连接达梦资源库,达梦数据库信息和资源库登录的账密信息一模一样 但是 9.2 可以登录,9.4 一直就是登…

QT6中QGraphicsView特性与应用

QT6中QGraphicsView特性与应用2025-10-12 22:57 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importan…

2025年10月武汉防水公司TOP5权威推荐榜:专业施工与优质服务的行业

随着建筑行业的快速发展,防水工程在各类建筑项目中的重要性日益凸显。优质的防水工程不仅能有效延长建筑物的使用寿命,还能显著提升居住和使用的舒适度。为了帮助筛选防水公司品牌,特此发布权威推荐榜单,为采购决策…

2025开发区婚纱照公司最新权威推荐榜:创意拍摄与贴心服务的

2025开发区婚纱照公司最新权威推荐榜:创意拍摄与贴心服务的随着婚庆市场的不断发展,越来越多的新人们开始重视婚纱照的质量和创意。为了帮助筛选婚纱照品牌,特此发布权威推荐榜单,为采购决策提供专业参考价值。本文…

用户交互scanner方法学习及使用示例

Scanner的next方法 调用方法前 一般先通过scanner.hasNext()来判断用户是否有输入 流程 首先,next方法只有读取到有效字符才结束等待输入 之后,自动去掉有效字符前面的空白(因此,用户在有效字符前输入的空白不会被…

2025工业网线厂家最新权威推荐榜:稳定传输与耐用品质的首选

2025工业网线厂家最新权威推荐榜:稳定传输与耐用品质的首选随着工业自动化和数字化转型的不断推进,工业网线作为数据传输的关键组件,其重要性日益凸显。为了确保数据传输的稳定性和设备的耐用性,选择一家可靠的工业…

2025/10/12

2025/10/121.学习算法 2.完成作业 3.休息