网站访问量大怎么办免费的网站模板有哪些

pingmian/2025/10/12 4:41:58/文章来源:
网站访问量大怎么办,免费的网站模板有哪些,虫部落是谁做的网站,房地产微网站模板序列生成器是一个非常经典的协程应用场景,尤其是在需要惰性生成数据或处理潜在无限的数据流时。 序列生成器概念#xff1a;序列生成器允许程序按需生成序列中的下一个元素#xff0c;而不是一次性计算整个序列。这种方式可以节省内存#xff0c;并允许处理无限或未知长度的…序列生成器是一个非常经典的协程应用场景,尤其是在需要惰性生成数据或处理潜在无限的数据流时。 序列生成器概念序列生成器允许程序按需生成序列中的下一个元素而不是一次性计算整个序列。这种方式可以节省内存并允许处理无限或未知长度的数据序列。 实现目标 简单的说序列生成器通常的实现就是在一个协程内部通过某种方式向外部传一个值出去并且将自己挂起外部调用者则可以获取到这个值并且在后续继续恢复执行序列生成器来获取下一个值。 显然挂起和向外部传值的任务就需要通过 co_await 来完成了外部获取值的任务就要通过协程的返回值来完成。 由此程序大致框架如下 Generator sequence() {int i 0;while (true) {co_await i;} }int main() {auto generator sequence();for (int i 0; i 10; i) {std::cout generator.next() std::endl;} }在generator 有个 next 函数调用它时需要想办法让协程恢复执行并将下一个值传出来。 调用者获取值 generator 的类型就是我们即将实现的序列生成器类型 Generator结合上一篇文章当中对于协程返回值类型的介绍我们先大致给出它的定义 struct Generator {struct promise_type {// 开始执行时直接挂起等待外部调用 resume 获取下一个值std::suspend_always initial_suspend() { return {}; };// 执行结束后不需要挂起std::suspend_never final_suspend() noexcept { return {}; }// 为了简单我们认为序列生成器当中不会抛出异常这里不做任何处理void unhandled_exception() { }// 构造协程的返回值类型Generator get_return_object() {return Generator{};}// 没有返回值void return_void() { }};int next() {//这里需要恢复线程} };想要在 Generator 当中 resume 协程的话需要拿到 coroutine_handle。 promise_type 是连接协程内外的桥梁标准库提供了一个通过 promise_type 的对象的地址获取 coroutine_handle 的函数它实际上是 coroutine_handle 的一个静态函数 //vs2022 struct coroutine_handle {constexpr coroutine_handle() noexcept default;constexpr coroutine_handle(nullptr_t) noexcept {}_NODISCARD static coroutine_handle from_promise(_Promise _Prom) noexcept { // strengthenedconst auto _Prom_ptr const_castvoid*(static_castconst volatile void*(_STD addressof(_Prom)));const auto _Frame_ptr __builtin_coro_promise(_Prom_ptr, 0, true);coroutine_handle _Result;_Result._Ptr _Frame_ptr;return _Result;}这样只需要在 get_return_object 函数调用时先获取 coroutine_handle然后再传给即将构造出来的 Generator 即可。 协程内部挂起并传值 观察一下最终实现的效果 Generator sequence() {int i 0;while (true) {co_await i;} }特别需要注意的是 co_await i; 其 后面的是一个整型值而不是在前面的文章当中提到的满足等待体awaiter条件的类型这种情况下该怎么办呢 实际上对于 co_await 表达式当中 expr 的处理C 有一套完善的流程 如果 promise_type 当中定义了 await_transform 函数那么先通过 promise.await_transform(expr) 来对 expr 做一次转换得到的对象称为 awaitable否则 awaitable 就是 expr 本身。 接下来使用 awaitable 对象来获取等待体awaiter。如果 awaitable 对象有 operator co_await 运算符重载那么等待体就是 operator co_await(awaitable)否则等待体就是 awaitable 对象本身。 那么只需要为数据类型实现一个 operator co_await 的运算符重载即可。 struct Generator {struct promise_type {int value;// 传值的同时要挂起值存入 value 当中std::suspend_always await_transform(int value) {this-value value;return {};}};std::coroutine_handlepromise_type handle;int next() {handle.resume();// 外部调用者或者恢复者可以通过读取 valuereturn handle.promise().value;} };定义了 await_transform 函数之后co_await expr 就相当于 co_await promise.await_transform(expr) 了。 协程的销毁 问题1无法确定是否存在下一个元素 当外部调用者或者恢复者试图调用 next 来获取下一个元素的时候它其实并不知道能不能真的得到一个结果。 为了解决这个问题我们需要增加一个 has_next 函数用来判断是否还有新的值传出来has_next 函数调用的时候有两种情况 已经有一个值传出来了还没有被外部消费还没有现成的值可以用需要尝试恢复执行协程来看看还有没有下一个值传出来 struct Generator {bool has_next() {// 协程已经执行完成if (handle.done()) {return false;}// 协程还没有执行完成并且下一个值还没有准备好if (!handle.promise().is_ready) {handle.resume();}if (handle.done()) {// 恢复执行之后协程执行完这时候必然没有通过 co_await 传出值来return false;} else {return true;}}int next() {if (has_next()) {// 此时一定有值is_ready 为 true // 消费当前的值重置 is_ready 为 falsehandle.promise().is_ready false;return handle.promise().value;}throw ExhaustedException();} }; 问题2协程状态的销毁比 Generator 对象的销毁更早 协程的状态在协程体执行完之后就会销毁除非协程挂起在 final_suspend 调用时。为了让协程的状态的生成周期与 Generator 一致在Generator可能会使用导协程状态我们必须将协程的销毁交给 Generator 来处理 struct Generator {class ExhaustedException: std::exception { };struct promise_type {// 总是挂起让 Generator 来销毁std::suspend_always final_suspend() noexcept { return {}; }};~Generator() {// 销毁协程handle.destroy();} };问题3复制对象导致协程被销毁 在 Generator 的析构函数当中销毁协程这本身没有什么问题。但如果把 Generator 对象做一下复制 Generator returns_generator() {auto g sequence();if (g.has_next()) {std::cout g.next() std::endl;}return g; }由于把 g 当做返回值返回了这时候 g 这个对象就发生了一次复制然后临时对象被销毁协程也就没了再调用直接dump。 为了解决这个问题需要妥善地处理 Generator 的复制构造器 struct Generator {explicit Generator(std::coroutine_handlepromise_type handle) noexcept: handle(handle) {}Generator(Generator generator) noexcept: handle(std::exchange(generator.handle, {})) {}Generator(Generator ) delete;Generator operator(Generator ) delete;~Generator() {if (handle) handle.destroy();} }只提供了右值复制构造器对于左值复制构造器我们直接删除掉以禁止使用。原因也很简单对于每一个协程实例都有且仅能有一个 Generator 实例与之对应因此我们只支持移动对象而不支持复制对象。 序列生成器完整实现 #include coroutine #include exception #include iostream #include threadstruct Generator {class ExhaustedException : std::exception { };struct promise_type {int value;bool is_ready false;std::suspend_always initial_suspend() { return {}; };std::suspend_always final_suspend() noexcept { return {}; }std::suspend_always await_transform(int value) {this-value value;is_ready true;return {};}void unhandled_exception() {}Generator get_return_object() {return Generator{ std::coroutine_handlepromise_type::from_promise(*this) };}void return_void() { }};std::coroutine_handlepromise_type handle;bool has_next() {if (handle.done()) {return false;}if (!handle.promise().is_ready) {handle.resume();//让协程恢复执行}if (handle.done()) {return false;}else {return true;}}int next() {if (has_next()) {handle.promise().is_ready false;return handle.promise().value;}throw ExhaustedException();}explicit Generator(std::coroutine_handlepromise_type handle) noexcept: handle(handle) {}Generator(Generator generator) noexcept: handle(std::exchange(generator.handle, {})) {}Generator(Generator) delete;Generator operator(Generator) delete;~Generator() {if (handle) handle.destroy();} };Generator sequence() {int i 0;while (i 5) {co_await i;} }Generator returns_generator() {auto g sequence();if (g.has_next()) {std::cout g.next() std::endl;}return g; }int main() {auto generator returns_generator();for (int i 0; i 15; i) {if (generator.has_next()) {std::cout generator.next() std::endl;}else {break;}}return 0; }使用 co_yield C 当中的 co_yield expr 等价于 co_await promise.yield_value(expr)我们只需要将前面例子当中的 await_transform 函数替换成 yield_value 就可以使用 co_yield 来传值了 std::suspend_always yield_value(int value) {this-value value;is_ready true;return {};}通常情况下使用 co_await 更多的关注点在挂起自己等待别人上而使用 co_yield 则是挂起自己传值出去。 使用序列生成器生成斐波那契数列 Generator fibonacci() {co_await 0; // fib(0)co_await 1; // fib(1)int a 0;int b 1;while (true) {co_await (a b); // fib(N), N 1b a b;a b - a;} }int main() {auto generator fibonacci();for (int i 0; i 15; i) {if (generator.has_next()) {std::cout generator.next() std::endl;}else {break;}}return 0; }fibonacci()通过连续的 co_await 表达式生成斐波那契数列的值。首先固定地生成 0 和 1然后进入循环不断计算后续数值并通过 co_await 暂停和恢复协程以生成数列。 协程的启动和恢复是通过 Generator::has_next 和 Generator::next 中的 handle.resume() 来控制的。 每次 co_await 在 fibonacci 中被调用时协程暂停并在 await_transform 中处理新的值。 当 co_await 后的表达式执行完毕后协程在 await_transform 返回的挂起点恢复。

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

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

相关文章

免费制作永久个人网站安徽网站建设合肥网站建设

文章目录 前言一、适配器模式概述1.定义与目的2.使用场景系统升级与集成接口不一致问题的解决兼容旧版本API多种数据源处理 二、适配器模式的结构1.主要组件适配器(Adapter)目标接口(Target Interface)被适配者(Adapte…

网站推广哪个好wordpress默认用户名密码破解

本文收录于《Scratch等级认证CCF-GESP图形化真题解析》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(共 10 题,每题 2 分,共 30 分) 第1题 小杨父母带他到某培训机构给他报名参加 CCF 组织的 GESP 认证考试的第 1 级,那他可以选择的认证语言有几…

如何建设部网站查职称网站美观界面

代码基于yolov5 v6.0 目录: yolo源码注释1——文件结构yolo源码注释2——数据集配置文件yolo源码注释3——模型配置文件yolo源码注释4——yolo-py datasets # 用于存放数据集的默认文件夹yolov5 data # 模型训练的超参数配置文件以及数据集配置文件 hyps # 存放超参…

塘厦 网站建设 百度推广手机网站怎么备案

转自 https://www.csdn.net/article/2015-07-30/2825340 简介: Docker通过namespace将容器与主机上的网络和运行环境进行了隔离,默认情况下,在容器中运行带界面的软件在外部是看不到的。在这个分享中,将介绍通过共享X11套接字让外…

本人做静态网站开发网站session 验证

所谓的js页面跳转就是利用javesrcipt对打开的页面ULR进行跳转,如我们打开的是A页面,通过javsrcipt脚本就会跳转到B页面。目前很多垃圾站经常用js跳转将正常页面跳转到广告页面,当然也有一些网站为了追求吸引人的视觉效果,把一些栏…

中国施工总承包100强seo快排软件

使用 Chrome Timeline 来优化页面性能有时候,我们就是会不由自主地写出一些低效的代码,严重影响页面运行的效率。或者我们接手的项目中,前人写出来的代码千奇百怪,比如为了一个 Canvas 特效需要同时绘制 600 个三角形,…

重庆高端网站设计自建网站公司

在ADS中,信号上升时间为信号从0~100%所用的时间,而实际上定义的上升边均为10%~90%,所以可以认为上升边=0.8*ADS设置上升时间。 一、终端开路及短路的反射信号 1.仿真条…

网站建设报价单初期整理代理游戏

目录: 目录 1 JSP基础知识架构 1 指令标识 1 Page命令 2 Including指令 3 taglib指令 2 脚本标识 1 JSP表达式 2 声明标识 3 代码片段 3 JSP注释 1 HTML注释 2 带有JSP表达式的注释 3 隐藏注释 4 动态注释 4 动作标识 1 包含文件标识 2 请求转发标…

wap网站制作哪家好wordpress 自动发货

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情 对于谷歌和安卓来说,这是一个重要时刻。谷歌刚刚发布了 Gemini 1.0,这是其最新的LLM,它采用了 OpenAI 的 GPT4。 共有三种不同…

检测站营销方案石家庄新闻主持人

在实际开发中,我们经常会遇到下载文件的需求,一般情况下接口最好的处理方式为上传到文件对象存储服务器,然后给前端返回一个下载文件的URL,前端直接打开链接下载就可以了,但…在下载数据量大且参数复杂的情况下&#x…

服务器不是自己的做违法网站2345浏览器网页版入口

引言 PWM(脉冲宽度调制)是一种常见的模拟控制方式,通过调节脉冲宽度来控制功率输出的占空比,从而实现模拟信号的传输和控制。在许多领域中,PWM都得到了广泛的应用,如电机控制、LED调光、音频控制等。本文将…

宁波网站建设公司代理小程序短链接生成网址

8 / 14【育明教育】中国考研考博专业课辅导第一品牌 官方网站:http://www.doczj.com/doc/e25fb4dad4d8d15abe234eb2.html8《翻译硕士英语》重点考察考生的英语水平,内容包括:词汇语法、阅读理解、英语写作等, 总分 100 分。 二、考…

江西网站建设公司费用html网页设计工具

前言 部署在 Kubernetes 集群中的应用,在升级发布时可能会存在的问题: 1,由于 Kuberneter 底层 Pod 容器生命周期与网络组件生命周期是异步管理的,在升级时如果没有处理好应用优雅退出的问题,就很容易导致 http 访问请…

网站制作 万网wordpress 恢复默认

摘要: 特斯拉公司惨遭“毒手”是因为其Kubernetes平台没有设置密码保护。 点此查看原文:http://click.aliyun.com/m/43609/ 几个月前RedLock公司工作人员发现:数百个Kubernetes管理控制台无需密码即可访问,即直接公开暴露在互联网…

广告网站建设公司域名拍卖平台

linked from http://www.tompda.com/neirong.asp?id809 西门子新款A系列手机   首页 > 新闻资讯 提交 shizhi 2005-2-25  阅读:2739次 10篇评论 西门子公司近日推出了A系列手机,A系列手机作为入门级手机,设计和功能十分简洁和实用。 西门子A70:设…

做车身拉花的网站高端网站建设域名注册

开坑个新系列,主要面向新手,老司机可以忽略。这个系列内的文章将会让你知道如何做到让你写的爬虫在运行的时候速度能像火箭一样快!很多初学爬虫的朋友对于这方面的知识似乎是空白的,甚至还有一些在爬虫岗位上工作了一两年的人也搞…

济南网站优化公司艾乎网wordpress 利用页面搞

首先在simlink中找到HDL CODER 打开红色Blank DUT,进入里面绿色的子系统开始设计系统 例如设计一个正弦信号发生器,里面用到了add、memory、relation operator、switch、constant、cos模块,cos模块选择了cordic算法,使用cordic那…

免费网站推荐货源wordpress 图片 alt

目录 1. Spring 概述 1.1 Spring是什么 1.2 Spring的作用 1.3 Spring IoC是什么 2. Spring 快速入门 3. Spring Bean 3.1 的实例化方式 空参构造器 3.2 的属性注入 全参构造器注入 setter方法注入 策略模式 3.3 注解管理 3.4 注解方式的属性注入 1. Spring 概述 …

jsp网站开发公司wordpress自动超链接

基础知识 NLP-分词器:SentencePiece【参考Chinese-LLaMA-Alpaca在通用中文语料上训练的20K中文词表并与原版LLaMA模型的32K词表进行合并的代码】_sentencepiece 中文训练-CSDN博客 【OpenLLM 008】大模型基础组件之分词器-万字长文全面解读LLM中的分词算法与分词器…

站酷海洛带网站的图片素材

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…