rust学习(tokio协程分析二)

例子:

我们如果使用new_current_thread来创建tokio的协程运行runtime时,

let rt = tokio::runtime::Builder::new_current_thread().enable_all().build().unwrap();

发现只有调用rt.block_on(...)才能触发。这里我们分析一下为何在new_current_thread的runtime下无法运行的原因。

代码1

fn testCoroutine4() {thread::spawn(||{let rt = tokio::runtime::Builder::new_current_thread().enable_all().build().unwrap();let guard1 = rt.enter();println!("trace1", );rt.spawn(doSayHi());println!("trace2", );rt.spawn(doSayHi());println!("trace3", );}).join();
}

这个无法运行的情况是由于执行完最后代码println!("trace3", );之后,线程直接就退出了,没有机会做调用栈切换。

根据代码1的情况,我们考虑是否可以保持线程不退出(如代码2),这样是否可以执行到协程(doSayHi)呢?

代码2:

fn testCoroutine5() {thread::spawn(||{let rt = tokio::runtime::Builder::new_current_thread().enable_all().build().unwrap();let guard1 = rt.enter();println!("trace1", );rt.spawn(doSayHi());println!("trace2", );rt.spawn(doSayHi());println!("trace3", );thread::sleep(Duration::from_secs(10));}).join();
}

和遗憾,还是没有运行doSayHi,这是为什么呢?因为thread::sleep直接把线程sleep了,协程的调用栈也没有被切换。

我们来看一下可以运行的代码:

代码3:

fn testCoroutine6() {thread::spawn(||{let rt = tokio::runtime::Builder::new_current_thread().enable_all().build().unwrap();let guard1 = rt.enter();println!("trace1", );let v1 = rt.spawn(doSayHi());println!("trace2", );let v2 = rt.spawn(doSayHi());println!("trace3", );rt.block_on(v1);rt.block_on(v2);}).join();
}

输出:

我们可以看到可以正常打印了。所以我们来想一下协程需要依赖哪些情况才能运行:

1.没有退出的线程

2.有切换调用栈的入口

按照上面的思路,我们是否不用block_on(v1)也能保证协程运行能?其实是可以的,参看

fn testCoroutine4() {thread::spawn(||{let rt = tokio::runtime::Builder::new_current_thread().enable_all().build().unwrap();let guard1 = rt.enter();println!("trace1", );rt.spawn(doSayHi());println!("trace2", );rt.spawn(doSayHi());println!("trace3", );loop {rt.block_on(async {println!("sleep start", );time::sleep(Duration::from_secs(10)).await;println!("sleep end", );});}}).join();
}

哈哈,可以看到,线程最后启动了一个和之前毫无关系的协程代码,里面只是一个sleep(注意!!这个是tokio的sleep),这个sleep的作用就是满足线程有一个协程切换的入口点。我们运行一下看看结果:

正常运行。不过这个代码只是用来验证我们对协程的认识,不建议正式代码中使用。

总结:

之前用过C语言的libco,它的原理是通过注册了libc的大部分posix的io操作函数,然后通过epoll来实现异步io来实现。例如读取socket的数据,如果没有数据,由于是异步io,所以直接切换到下一个调用栈。这样就实现了简单的协程。rust这块貌似对整个协程做了统一的接口管理?在协程中的sleep等操作一定要调用tokio的接口,否则就会直接造成卡死。哈哈。不过如果是multi_thread的话,实际上也没啥关系,就是直接将协程变成了线程操作,程序应该不会出现卡死。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

20240301作业

1.使用fwrite、fread将一张随意的bmp图片&#xff0c;修改成德国的国旗 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> int main(int argc, const char *argv[]) {FILE* fp fopen("./gaoda.bmp","…

SpringBoot+Vue实战:打造企业级项目管理神器

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

vue面试:MVVM、MVC、MVP的区别?

vue面试&#xff1a;MVVM、MVC、MVP的区别&#xff1f; MVVM、MVC、MVP是什么&#xff1f;&#xff08;1&#xff09;MVC&#xff08;2&#xff09;MVVM&#xff08;3&#xff09;MVP MVVM、MVC、MVP是什么&#xff1f; MVC、MVP 和 MVVM 是三种常见的软件架构设计模式&#x…

【复现】蓝凌OA SQL注入漏洞_61

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 蓝凌智能OA是由深圳市蓝凌软件股份有限公司开发&#xff0c;是一款针对中小企业的移动化智能办公产品&#xff0c;融合了钉钉数字…

【前端素材】推荐优质在线大气数码商城电商网页ClassiList平台模板(附源码)

一、需求分析 1、系统定义 电子数码电商平台是专门销售电子数码产品&#xff08;如手机、电脑、相机、智能设备等&#xff09;的在线电子商务平台。这些平台提供了一个便捷的购物环境&#xff0c;让消费者可以方便地浏览、比较和购买各种电子数码产品。 2、功能需求 在线大…

苹果备忘录导出方法

文章目录 前言方法1&#xff1a;iCloud 导出方法2&#xff1a;Pages 文稿导出&#xff08;最推荐&#xff09;方法3&#xff1a;借助Mac软件导出总结 前言 苹果生态真是让我们又爱又恨&#xff0c;其得益于无缝整合、安全性和应用程序生态系统&#xff0c;能够让在用户在自己的…

渗透测试靶场环境搭建

1.DVWA靶场 DVWA&#xff08;Damn Vulnerable Web Application&#xff09;是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用&#xff0c;包含了OWASP TOP10的所有攻击漏洞的练习环境&#xff0c;旨在为安全专业人员测试自己的专业技能和工具提供合法的环境&#xff0c;同时…

叠纸探索开放世界,女性向游戏的新生机?

女性向游戏也能搭载开放世界&#xff1f; 随着新一批游戏版号的发放&#xff0c;叠纸的新作《无限暖暖》毫无疑问成为了最受关注的游戏之一&#xff0c;换装冒险开放世界的组合为女性向游戏市场带来了新的惊喜。 作为暖暖系列的第五部作品&#xff0c;《无限暖暖》对比前作可以…

数据库常见理论常见面试题(总结)

一、前言 这里呢&#xff0c;博主会介绍一些平时关于数据库的理论的问题&#xff0c;比如数据库的三级模式两级映射、触发器、范式、存储过程、视图等等概念知识&#xff0c;但是像索引、事务、锁等内容&#xff0c;之前的文章就讲解过了&#xff0c;这里就不作过多的介绍了&am…

transformer--编码器2(前馈全连接层、规范化层、子层链接结构、编码器层、编码器)

前馈全连接层 什么是前馈全连接层: 在Transformer中前馈全连接层就是具有两层线性层的全连接网络 前馈全连接层的作用: 考虑注意力机制可能对复杂过程的拟合程度不够,通过增加两层网络来增强模型的能力 code # 前馈全连接层 class PositionwiseFeedForward(nn.Module):de…

图片如何无损放大?分享三个方法帮你快速解决

在数字时代&#xff0c;图片已成为我们生活的重要组成部分&#xff0c;无论是社交媒体的分享&#xff0c;还是专业设计的呈现&#xff0c;都离不开高质量的图片。然而&#xff0c;当我们试图放大一张图片以获取更多细节时&#xff0c;常常会遇到一个令人头疼的问题——失真。此…

多版本jdk共享jar

多版本jdk共享jar Java 9的一个有趣特性是支持多版本JAR文件。这是什么意思?过去&#xff0c;库开发人员在支持新版本的Java时有三种选择: 提供两个(或更多)不同的JAR文件&#xff0c;每个文件对应他们想要支持的Java版本。它们的版本号可能是“1.2-java-5”和“1.2-java-1.…

小工具——抖音短视频评论自动同步

很多时候喜欢看抖音的评论&#xff0c;有时候评论也是一个查疑解惑的好地方&#xff0c;很多人也喜欢把抖音的评论集中起来做分析。 因为一个朋友问过我这回事&#xff0c;闲着的时候也研究了下抖音&#xff0c;所以自己做了个小工具&#xff0c;自动同步你观看的抖音短视频的…

解读人工智能的理论基石

1956年的一个夏天&#xff0c;在达特茅斯学院的一个小会议室里&#xff0c;一群充满好奇和野心的年轻科学家聚集在一起&#xff0c;他们有一个共同的梦想&#xff1a;创造能够模仿人类智能的机器。这不仅仅是科幻小说的情节&#xff0c;更是人工智能历史上一个真实的起点。从那…

深度强化学习入门(待修改)

目录 前言 一、强化学习 1.马可洛夫链 2.蒙地卡罗 3.时序差分TD 4.gym学习​编辑 FrozenLake 二、RL基本算法 1.Q-learning和SARSA 2.DQN Deep network Qlearning DQN 三、PG策略算法 总结 前言 这段时间学习深度强化学习的总结。 一、强化学习 强化学习是做出最佳决策的科学…

useState多次渲染页面卡顿 useMemo

useState多次渲染页面卡顿 state变化了组件自然应该重新进行渲染&#xff0c;但有时我们并不需要。 React.memo()(useMemo)是一个高阶组件&#xff0c;它接收另一个组件作为参数&#xff0c;并且会返回一个包装过的新组件&#xff0c;包装过的新组件就会具有缓存作用&#xff…

Freesia 构建本地项目与远程仓库

构建远程仓库 1. 创建一个项目目录&#xff0c;根据创建远程仓库后的提示来进行 2. 本地仓库初始化 git init 初始化git文件 cd 项目目录 git init创建并提交README.md文件 touch README.md git commit -m "first commit"将本地仓库连接到远程仓库 git remote …

基于session注册JAva篇springboot

springboot3全家桶&#xff0c;数据库 &#xff1a;redis&#xff0c;mysql 背景环境&#xff1a;邮箱验证码&#xff0c;验证注册 流程&#xff1a;先通过邮箱验证&#xff0c;发送验证码&#xff0c;将获取到的session和验证码&#xff0c;存入redis里&#xff08;发送邮箱…

js截取图片地址后面的参数和在路径中截取文件名或后缀名

文章目录 前言截取地址 &#xff1f;后面的参数在路径中截取文件名或后缀名总结 前言 在处理网页上的图片资源或者其他类型的文件资源时&#xff0c;你可能会遇到需要使用这些技巧的情况。以下是一些具体的使用场景&#xff1a; 动态修改图片参数&#xff1a;如果你有一个图片U…

2024年【制冷与空调设备运行操作】考试总结及制冷与空调设备运行操作模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 制冷与空调设备运行操作考试总结参考答案及制冷与空调设备运行操作考试试题解析是安全生产模拟考试一点通题库老师及制冷与空调设备运行操作操作证已考过的学员汇总&#xff0c;相对有效帮助制冷与空调设备运行操作模…