Rust异步运行时框架tokio保姆级教程

1. 简介

Tokio 是一个用于构建高性能异步应用程序的 Rust 异步运行时框架。它提供了基本的异步 I/O 操作、任务调度、定时器等功能,适合于构建网络服务器、客户端等。

2. 环境准备

Cargo.toml 中添加以下内容:

[dependencies]
tokio = { version = "1", features = ["full"] }

3. 创建一个简单的异步应用

3.1. 基本异步函数

一个简单的异步函数:

use tokio::time::{sleep, Duration};async fn say_hello() {println!("Hello, world!");sleep(Duration::from_secs(1)).await;println!("Goodbye, world!");
}

3.2. 运行异步任务

使用 Tokio 的运行时来运行异步任务:

#[tokio::main]
async fn main() {say_hello().await;
}

4. 异步 I/O 示例

下面是一个简单的 TCP 服务器示例,演示如何使用 Tokio 进行异步网络编程。

4.1. 创建 TCP 服务器
use tokio::net::TcpListener;
use tokio::prelude::*;#[tokio::main]
async fn main() -> std::io::Result<()> {let listener = TcpListener::bind("127.0.0.1:8080").await?;println!("Server listening on 127.0.0.1:8080");loop {let (mut socket, _) = listener.accept().await?;tokio::spawn(async move {let mut buf = [0; 1024];match socket.read(&mut buf).await {Ok(0) => return, // 连接已关闭Ok(n) => {// 将数据写回客户端if let Err(e) = socket.write_all(&buf[0..n]).await {eprintln!("Failed to write to socket; err = {:?}", e);}}Err(e) => {eprintln!("Failed to read from socket; err = {:?}", e);}}});}
}

5. 异步任务和并发

Tokio 允许并行运行多个异步任务。

#[tokio::main]
async fn main() {let task1 = tokio::spawn(async {// 模拟一些异步工作sleep(Duration::from_secs(1)).await;println!("Task 1 completed");});let task2 = tokio::spawn(async {// 模拟另一些异步工作sleep(Duration::from_secs(2)).await;println!("Task 2 completed");});let _ = tokio::try_join!(task1, task2);
}

6. 使用 Tokio 的定时器

Tokio 提供了一个方便的定时器,可以用于延迟执行任务:

#[tokio::main]
async fn main() {println!("Waiting for 2 seconds...");sleep(Duration::from_secs(2)).await;println!("2 seconds passed!");
}

7. 错误处理

在异步代码中处理错误与同步代码类似,但通常会使用 Result 类型进行处理。

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {let result = do_something_async().await?;println!("Result: {}", result);Ok(())
}

8. 总结

Tokio 提供了强大的工具来进行异步编程。使用它,可以轻松构建高性能的网络应用。

9. 参考资料

  • Tokio 官方文档
  • Rust 官方文档

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

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

相关文章

干货丨通信网络与大模型的融合与协同

本文首发《中兴通讯技术》&#xff0c;2024年4月&#xff0c;第30卷第2期&#xff0c;作者&#xff1a;浙江大学在读本科生任天骐&#xff0c;浙江大学信息与电子工程学院副教授李荣鹏&#xff0c;浙江大学兼任教授、博士生导师张宏纲。边缘计算社区经过授权发布&#xff0c;以…

[ vulnhub靶机通关篇 ] 渗透测试综合靶场 DarkHole:1 通关详解 (附靶机搭建教程)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

对于一个STM32外设的应用有哪一些?可以列举一个实际的设计案例吗?

STM32 具有丰富的外设&#xff0c;以下是一些常见的应用&#xff1a; 1. **GPIO&#xff08;通用输入输出&#xff09;**&#xff1a; - 控制 LED 灯的亮灭。 - 读取按键状态。 - 与外部数字设备进行通信&#xff0c;如驱动数码管。 2. **USART&#xff08;通用同步异步收发器…

iDP3——改进3D扩散策略以赋能人形机器人的训练:不再依赖相机校准和点云分割(含DP3、Diff-Control、ControlNet详解)

前言 今天10.23日&#xff0c;明天1024则将作为长沙程序员代表&#xff0c;在CSDN和长沙相关部门举办的1024程序员节开幕式上发言&#xff0c;欢迎广大开发者来长工作 生活 考察 创业&#xff0c;​包括我司七月也一直在招聘大模型与机器人开发人员 后天&#xff0c;则将和相关…

前端 react 面试题(二)

文章目录 hooks的使用规则为什么hooks要确保在函数组件的最顶层,而不能放置在循环或者条件语句中。react的事件模型react的合成事件是如何实现的react事件传参,可以使用箭头函数或bind方法,这两种哪一种更好使用箭头函数:使用`bind`方法:react的事件模型和vue的区别React …

【P2-10】ESP8266 WIFI模块连接原子云服务器与原子云APP通信

前言:本节实现ESP8266 WIFI模块连接原子云服务器与原子云APP通信。 演示视频: 【物联网】ESP8266 WIFI模块连接原子云服务器与原子云APP通信 目录 1.WIFI模块连接原子云服务器互相通信 2.WIFI模块与原子云APP通信 1.WIFI模块连接原子云服务器互相通信 原子云服务器登陆入…

2024-11-4 学习人工智能的Day21 openCV(3)

图像滤波 所为图像滤波通过滤波器得到另一个图像 什么是滤波器 在深度学习中&#xff0c;滤波器又称为卷积核&#xff0c;滤波的过程成为卷积 卷积核概念 卷积核大小&#xff0c;一般为奇数&#xff0c;如 3*35*57*7 为什么卷积核大小是奇数&#xff1f; 原因是&…

CSS基础知识六(浮动的高度塌陷问题及解决方案)

目录 1.浮动高度塌陷概念 2.下面是几种解决高度塌陷的几种方案&#xff1a; 解决方案一&#xff1a; 解决方案二&#xff1a; 解决方案三&#xff1a; 1.浮动高度塌陷概念 在CSS中&#xff0c;高度塌陷问题指的是父元素没有正确地根据其内部的浮动元素或绝对定位元素来计…

8、raid磁盘阵列

raid级别及概念 不同分区组成的逻辑硬盘&#xff0c;可以实现高可用&#xff0c;即阵列当中有一个分区的硬盘损坏&#xff0c;不影响整个阵列的使用&#xff0c;可以满足企业级的读写性能的要求。 raid磁盘阵列——raid级别&#xff1a; raid0&#xff0c;raid1&#xff0c;…

hivt实战

argoverse数据集和API forcasting包含tracking的结果&#xff0c;然后结合argo-api去获取hdmap数据 重要的api 数据结构 lane segment argoverse-api/argoverse/map_representation/lane_segment.py at master argoverse/argoverse-api GitHub 练习 get started with th…

CVE-2024-26229 Windows CSC服务权限提升漏洞复现

一、漏洞描述 csc.sys驱动程序中带有METHOD_NEITHER I/O控制代码的IOCTL地址验证不正确&#xff0c;导致任意地址写入漏洞。 METHOD_NEITHER是 Windows 驱动程序中的一种 I/O 控制代码数据传输方法。它允许驱动程序在处理 I/O 请求时&#xff0c;直接从用户模式缓冲区读取或向…

Chrome与傲游在隐私保护上的表现

在数字化时代&#xff0c;浏览器作为我们探索互联网世界的重要工具&#xff0c;其隐私保护功能的强弱直接关系到用户的信息安全。本文将深入对比Chrome与傲游两款主流浏览器在隐私保护方面的表现&#xff0c;并提供实用的教程&#xff0c;帮助用户更好地管理自己的隐私设置。&a…

zip文件加密成图片文件-到解密

加密 1&#xff0c;准备&#xff1a;图片 zip文件 2&#xff0c;新建一个.txt 根据自己的对应文件修改&#xff1a; copy 图片名.后缀/b压缩包名.后缀自定义图片名.后缀注意&#xff0c;图片后缀最后保持一至&#xff0c;测试了 jpg png 压缩包 zip 3&#xff0c;把上…

1-ARM Linux驱动开发-MIO控制

一、前言 MIO也属于是字符设备&#xff0c;将MIO复用为GPIO可以实现对LED等外设的控制&#xff0c;其本质是从寄存器层面对硬件的控制。这次主要记录一下GPIO控制LED的驱动。 官网ZYNQ寄存器手册https://docs.amd.com/r/en-US/ug1087-zynq-ultrascale-registers/Overview 二…

深入解析Sysmon日志:增强网络安全与威胁应对的关键一环

不断演进的网络安全领域中&#xff0c;保持对威胁的及时了解至关重要。Sysmon日志在这方面发挥了至关重要的作用&#xff0c;通过提供有价值的见解&#xff0c;使组织能够加强其安全姿态。Windows在企业环境中是主导的操作系统&#xff0c;因此深入了解Windows事件日志、它们的…

HTMLCSS:呈现的3D树之美

效果演示 这段代码通过HTML和CSS创建了一个具有3D效果的树的图形&#xff0c;包括分支、树干和阴影&#xff0c;通过自定义属性和复杂的变换实现了较为逼真的立体效果。 HTML <div class"container"><div class"tree"><div class"…

XingHan-Team团队官网系统源码 全开源

XingHan-Team 官网程序是一个现代化的企业官网管理系统&#xff0c;由星涵网络工作室开发。 本系统提供了完整的网站内容管理功能&#xff0c;包括用户管理、内容发布、成员查询、成员申请等功能。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/8995…

JAVA:常见 JSON 库的技术详解

1、简述 在现代应用开发中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;已成为数据交换的标准格式。Java 提供了多种方式将对象转换为 JSON 或从 JSON 转换为对象&#xff0c;常见的库包括 Jackson、Gson 和 org.json。本文将介绍几种常用的 JSON 处理…

【贪心】【可行范围内最大边界】SCNU习题 P25.跳跃游戏

算法思想&#xff1a; 每次迭代更新可行至的最大范围r(r必保证>原位置&#xff09;&#xff0c;至到迭代结束&#xff0c;若r>length of array则说明可以跳跃至此 #include <iostream> #include <vector> #include <string> #include <sstre…

Redis 组网方式入门

文章目录 一、组网方式1. 单实例模式描述优点缺点适用场景 2. 主从复制模式&#xff08;Master-Slave Replication&#xff09;描述优点缺点适用场景基于docker的redis主从复制1. 配置主节点2. 配置从节点3. 查看节点状态4. 验证主从数据同步5. 查看同步进度 3. 哨兵模式&#…