C++的简单异步
位置
主要有:懒/执行器/生成器/批操作/协程锁/协程条件变量/有栈协程
等组件.
简单回声示例
简单异步::协程::懒<空>
会话(传控::套接字 套接字){
对(;;){
常 大小型 最大长度=1024;
符 数据[最大长度];
动[错误,长度]=协待 异步读些(套接字,异网::缓冲(数据,最大长度));
如(错误){
抛 异网::系统错误(错误);
}
协待 异步写(套接字,异网::缓冲(数据,长度));//两个协待.
}
}
协程是特殊函数,C++20
的挂起协程
按纯数据
处理.
用途:事件驱动应用/异步IO/生成器/惰性求值
.
异步发送邮件的客户端
假如用回调
,最简单基本上就是>4
个圈.难以维护.用协程来写:
动 错误码=协待 异步连接(主机,端口);//连接
错误码=协待 异步处理握手();//握手
发送数据=构建请求();
错误码=协待 异步写(发送数据);//写
当(真){
协待 异步读(响应);//读数据
如(完成()){
输出<<"发送电邮好\n";断;
}
附加响应(接收数据_);
}
用协程改写
的异步代码
,圈复杂度降低到2
,即使后面再增加一些异步处理
的业务逻辑,也不会能增加圈复杂度
,始终保持逻辑
的简单易懂,这就是协程在异步IO
场景下的典型应用.
异步客户端示例
简单异步::协程::懒<空>发送电邮(){
串 主机=服务器_.服务器;
大小型 位置=主机.找("://");
如(位置!=串::几位置)主机.擦除(0,位置+3);
异网::ip::传控::解析器::查询 查询(
主机,服务器_.端口,异网::ip::解析器查询基::数值服务);
错误码 ec;
动 端点步=解析器_.解析(查询,ec);
ec=协待 异步连接(io环境_,套接字_,主机,服务器_.端口);//连接
如(ec){
输出<<"连接错误:"<<ec.消息()<<'\n';
抛 异网::系统错误(ec);
}
输出<<"连接好\n";
如 常式(是安套层)升级至安套层();
构建请求();
常 符*头=异网::转换缓冲<常 符*>(请求_.数据());
输出<<头<<'\n';
[[也许未用]]动[写错码,大小]=协待 异步写(
取套接字(),异网::缓冲(头,请求_.大小()));//异步写.
如(写错码){
输出<<"写失败,原因:"<<ec.消息()<<'\n';
抛 异网::系统错误(写错码);
}
当(真){
常 整 最大长度=1024;
符 读缓冲[最大长度];
[[也许未用]]动[读错码,大小]=协待 异步读些(
取套接字(),异网::缓冲(读缓冲,最大长度));//异步读
如(读错码){
输出<<"读失败,原因:"<<ec.消息()<<'\n';
抛 异网::系统错误(读错码);
}
串视 内容(读缓冲,大小);
输出<<内容;
如(内容.找("250邮件好")!=串视::几位置){
输出<<"结束简邮\n";断;
}
}
}
就像写同步
代码一样写异步
代码,发送邮件的核心函数
含异常处理和日志输出
也不过50
行代码,代码简洁易懂
,再也不用回调
函数了.这就是async_simple
协程库的威力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现