rust异步编程2

2023-11-11

概述

*异步编程参考书籍: async-book
此学习根据Rust语言圣经 中tokio专栏,tokio 是一个将 rust提供的async/await 特性编写的异步代码运行起来的异步运行时. (tokio,async-std, smol等异步运行时框架)

  • 为什么要使用 异步运行时Tokio
    rust本身只提供异步编程时候所需要的基本特性,标准库中Future特性,这些特性单独使用没有多大用处,需要有一个运行时将这些特性实现代码运行起来 ,选择使用Tokio 基于Future,和MONO 两种系统的框架运行的

async/await 介绍

async作为rust异步编程的工具,async 将一个代码块转换成实现Future特征的状态机, 在转换成为Future后作用:在同步方法中调用阻塞函数(asyn转换函数)会阻塞整个线程,但是阻塞的Future会让出线程控制权,让其他Future 运行

  • 状态机器四要素: 状态,动作,事件,跳转。
    动作:打开 关不, 事件: 按按钮
    future简答特性
    在Tokio中 异步运行时候提供核心 一个reactor(订阅机制), 多个executor执行器
use futures::executor;
// 异步关键字
async fn hello(){
    println!("Hello!");
}

fn main() {
	// 执行器组塞式调用
    executor::block_on(hello());
    println!("Hello, world!");
}
-- 通过await方式调用 不阻塞方式调用
use futures::{self, executor};
use std::thread::sleep;
use std::time::Duration;

async fn learn_song() {
    sleep(Duration::from_secs(5));
    println!("learn song");
}

async fn sing_song() {
    println!("sing song");
}

async fn dance() {
    println!("dance");
}

// 先学会唱歌,唱歌 后在跳舞
async fn learn_and_sing_song() {
    learn_song().await;
    sing_song().await;
}

async fn async_main(){
    let f1 = learn_and_sing_song();
    let f2 = dance();
    futures::join!(f1, f2); // 使用 join 方法进行了阻塞
    
}

fn main() {
    executor::block_on(async_main());
    println!("Hello, world!");
}
sing song
dance
Hello, world!

经典:问题一:
本来根据async 的定义 当某一个Future线程被阻塞(睡眠)后应该让出线程控制权,让其他的线程运行 ,但rust代码中执行结果不对, 还是按照阻塞方式顺序执行 这是为什么???
executor::join!() 保证两个异步函数并行执行

 实际执行为什么会不符合预期结果
 主要原因在于 Sleep 函数, 在rust中使用Sleep函数后 认为你是将本线程进行休眠,不是进行阻塞,如果想要达到阻塞的情形, 使用 async-std, tokio 等运行时框架的 delay_for
 use futures;
use tokio::runtime::Runtime;
async fn learn_song() {
    // 是不是由于Sleep并没有让当前线程阻塞 只是 线程休眠 导致输出结果一样的 使用tokio
    //sleep(Duration::from_secs(5));
    //  for _ in 0..10000 {
    //
    //  }
    tokio::time::sleep(tokio::time::Duration::from_secs(2)).await;
    println!("learn song");
}

async fn sing_song() {
    println!("sing song");
}

async fn dance() {
    println!("dance");
}

// 先学会唱歌,唱歌 后在跳舞
async fn learn_and_sing_song() {
    learn_song().await; // 阻塞后续代码执行 await
    sing_song().await;
}

async fn async_main(){
    let f1 = learn_and_sing_song();
    let f2 = dance();
    futures::join!(f1, f2); // 使用 join 方法进行了阻塞

}

fn main() {
    let runtime = Runtime::new().unwrap();
    runtime.block_on(async_main());
    println!("Hello, world!");
}
H:/programe/rust/.cargo/bin/cargo.exe run --color=always --package async_move --bin async_move
    Finished dev [unoptimized + debuginfo] target(s) in 0.16s
     Running `target\debug\async_move.exe`
dance
learn song
sing song
Hello, world!

Process finished with exit code 0

在高并发编程中有两种方式 1. 采用多线程 2. async 异步编程(js , 只有一个线程,但是使用async 框架)
总之,async编程并没有比多线程更好,最终还是根据你的使用场景作出合适的选择,如果无需高并发,或者也不在意线程切换带来的性能损耗,那么多线程使用起来会简单、方便的多!最后再简单总结下:

  • 有大量 IO 任务需要并发运行时,选 async 模型
  • 有部分 IO 任务需要并发运行时,选多线程,如果想要降低线程创建和销毁的开销,可以使用线程池
  • 有大量 CPU 密集任务需要并行运行时,例如并行计算,选多线程模型,且让线程数等于或者稍大于 CPU 核心数
  • 无所谓时,统一选多线程
    在这里插入图片描述
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

rust异步编程2 的相关文章

随机推荐

  • 一键清空朋友圈软件_微信清理朋友圈app下载-微信清理朋友圈下载v1.8.0 安卓版-西西软件下载...

    微信清理朋友圈app一款强大的微信清理工具 当你想要重置自己的微信号并删除所有的内容之时 又觉得一条条删太麻烦了 就可以用到这款神器工具 可以帮助你一键删除掉朋友圈内的所有内容 帮助你轻松的重置微信号 十分的方便 赶快下载微信清理朋友圈ap
  • CentOS系统性能工具 sar 示例!

    安装配置 Sysstat 安装 Sysstat 包 Ubuntu sudo apt get install sysstat CentOS yum install sysstat CentOS rpm ivh sysstat 10 0 0 1
  • 使用FFmpeg进行屏幕录像和录音

    有些时候我们需要对屏幕进行录制 比如制作视频教程 录制直播等 然而这方面的软件多是收费的 即使是免费试用版的还有水印 特别烦人 下面介绍使用FFmpeg进行屏幕录制的方法 Windows 先安装dshow软件 Screen Capturer
  • iOS推送(利用极光推送)

    本文主要是基于极光推送的SDK封装的一个快速集成极光推送的类的封装 不喜勿喷 1 首先说一下推送的一些原理 Push的原理 Push 的工作机制可以简单的概括为下图图中 Provider是指某个iPhone软件的Push服务器 这篇文章我将
  • Linux SSH登录服务器报ECDSA host key “ip地址“ for has changed and you have requested strict checking错误

    Linux SSH命令用了那么久 第一次遇到这样的错误 ECDSA host key ip地址 for has changed and you have requested strict checking 记录下方便记忆 解决方案 在终端上
  • 系统没有wmi服务器,系统没有WMI服务怎么办.WMI错误修复方法

    WMI是一项核心的Windows管理技术 WMI作为一种规范和基础结构 通过它可以访问 配置 管理和监视几乎所有的Windows资源 比如用户可以在远程计算机器上启动一个进程 设定一个在特定日期和时间运行的进程 远程启动计算机 获得本地或远
  • XCTF_Web_新手练习区:simple_js(源代码详解)

    文章目录 第七题 simple js 源代码详解 目标 Writeup 源代码详解 第七题 simple js 源代码详解 目标 掌握有关js的知识 Writeup 进入环境后我们遇到了输入密码 于是我们随便输入一个密码 点击确定 之后啥也
  • Android应用底部导航栏(选项卡)实例

    现在很多android的应用都采用底部导航栏的功能 这样可以使得用户在使用过程中随意切换不同的页面 现在我采用TabHost组件来自定义一个底部的导航栏的功能 我们先看下该demo实例的框架图 其中各个类的作用以及资源文件就不详细解释了 还
  • 十分钟利用windows7漏洞破解开机密码

    所有win7系统都使用 首先连按五下Shift键弹出粘滞键提醒 然后我们点击否后关机 启动系统时将其强制关机 虚拟机利用电源关闭虚拟机 自用主机就在开机时长按关机键强制关闭系统 随后启动系统 我们选择启动启动修复 推荐 选择取消即不还原 等
  • Python数据可视化——折线图

    Python数据可视化 折线图 随着数据分析和数据科学的飞速发展 数据可视化成为了越来越重要的一环 而Python作为一门强大的编程语言 其在数据可视化领域也有着不俗的表现 本文将为大家介绍如何使用Python的Matplotlib库创建一
  • 【Transformers】第 6 章:用于标记分类的微调语言模型

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • Vue.config.js常用配置详解

    摘要 本文将介绍Vue config js中常用的配置选项 包括publicPath outputDir devServer chainWebpack等 并提供相应的代码示例 帮助读者更好地理解和配置Vue项目 1 publicPath p
  • 新汽车电子技术图谱

    商业模式 改变传统对于OEM来讲的 卖车即结束 的模式 会员模式 共享模式 租赁模式 运营模式等各种新型的数字出行体验模式 OTA云 远程刷新 远程诊断 远程车控 远程数据上传 第三方App 应用商店 边缘计算 多级云计算 大数据处理 AI
  • Android4.4深入浅出之SurfaceFlinger与Client通信框架(一)

    SurfaceFlinger框架是基于Binder进程间通信机制搭建的 SF作为一个服务进程 用户程序想要跟它通信必然要经过Binder机制 首先说一下 用户要跟SF通信 那么SF必须出现在ServiceManager中 因为SF也是一个服
  • ROS STAGE教程1

    默认路径opt ros kinetic share 下有stage 和 stage ros 到该路径下可运行 rosrun stage ros stageros rospack find stage ros world willow err
  • STM32+HC-05蓝牙模块学习与使用

    HC 05蓝牙串口通信 HC05模块是一款高性能主从一体蓝牙串口模块 是一种集成蓝牙功能的PCBA板 用于短距离无线通信 十分方便 从某宝商家那里可以看到 蓝牙可以使用多种方法使用 这里我使用的是蓝牙主机连接 所以我们这里需要准备的器件 两
  • 【python学习】函数式编程和高阶函数 map filter reduce lambda表达式 sorted 闭包 装饰器

    函数式编程就是一种抽象程度很高的编程范式 纯粹的函数式编程语言编写的函数没有变量 因此 任意一个函数 只要输入是确定的 输出就是确定的 这种纯函数我们称之为没有副作用 而允许使用变量的程序设计语言 由于函数内部的变量状态不确定 同样的输入
  • cudaMemcpy() 犯错误

    cudaMemcpy void dst const void src size t count enum cudaMemcpyKind kind 错误 count 是 bytes 个数 不是数据类型个数 让我debug好久的一个错误啊 转载
  • YUV图像数据分析

    做视频采集与处理 自然少不了要学会分析YUV数据 因为从采集的角度来说 一般的视频采集芯片输出的码流一般都是YUV数据流的形式 而从视频处理 例如H 264 MPEG视频编解码 的角度来说 也是在原始YUV码流进行编码和解析 所以 了解如何
  • rust异步编程2

    概述 异步编程参考书籍 async book 此学习根据Rust语言圣经 中tokio专栏 tokio 是一个将 rust提供的async await 特性编写的异步代码运行起来的异步运行时 tokio async std smol等异步运