网站设计流程电话,网站建设浙江,建设企业查询平台,万界商城系统关于tokio的select宏#xff0c;有不少的用途。包括超时和竞态选择等。
关于select宏需要关注#xff0c;相关的异步条件#xff0c;会同时执行#xff0c;只是当有一个最早完成时#xff0c;会执行“抛弃”和“对应”策略。
说明#xff1a;对本文以下素材的来源表示感…关于tokio的select宏有不少的用途。包括超时和竞态选择等。
关于select宏需要关注相关的异步条件会同时执行只是当有一个最早完成时会执行“抛弃”和“对应”策略。
说明对本文以下素材的来源表示感谢 https://zhuanlan.zhihu.com/p/14498925766select宏分支匹配的定义
pattern async expression handlerpattern当有返回值且需要处理往往用val、Some(val)待形式表示如果没有返回值或返回值不需处理往往用”_“来表示。 而async expression部分就是我们所指的condition_action部分。而handler部分就是分支对应的”后续任务“部分。
一、toml
[dependencies]
tokio { version 1.42.0, features [full] }二、main.rs
说明 condition_action为异步条件任务在后面的是“后续任务”。是否执行”后续任务“的前提是哪个条件任务是最早完成。但这个选择是通过异步同时执行所有的”条件任务“PK出来的。
举个例子可能更清楚
比如学校某班级有3位同学测试其运动水平高低并决定水平最高的人可以参加学校运动会比赛篮球或足球比赛这个举例不一定合理。假设设定测试条件任务是跑10000米(即condition_action)那么我们可以让3位同学同时跑首先冲过终点的人马上去参加比赛(“后续任务”)。
当3位同学中只要有人首先冲过终点condition_action结束就让他去代表参加比赛执行后续任务篮球或足球由其决定。很显然其它的人就不用跑了可以停下来了即被抛弃了更不需要去参赛。
use tokio::time;async fn conditon_action(s: String) - String{println!(\t 执行条件任务 {} 开始., s);time::sleep(time::Duration::from_secs(1)).await;println!(\t 执行条件任务 {} 结束! 后续执行 {},其它任务不执行, s,s);s
}#[tokio::main]
async fn main() {for i in 0..3 {println!(Round {}:, i);time::sleep(time::Duration::from_secs(2)).await;// 注意(1) select!会同时执行_A和_B两个任务// (2)但是只会选择_A与_B中最先完成的任务对应的任务来执行后续的任务// (3)同时_A与_B中没有被执行完的部分后续不执行。具体表现在condition_action函中有“开始”没有“结束”.tokio::select! {val conditon_action(i.to_string()_A) {println!(\t 执行后续任务{} 开始., val);time::sleep(time::Duration::from_secs(2)).await;println!(\t 执行后续任务{} 结束., val);},val conditon_action(i.to_string()_B) {println!(\t 执行后续任务{} 开始., val);time::sleep(time::Duration::from_secs(2)).await;println!(\t 执行后续任务{} 结束., val);}}}
}
输出
Round 0:执行条件任务 0_B 开始.执行条件任务 0_A 开始.执行条件任务 0_A 结束! 后续执行 0_A,其它任务不执行执行后续任务0_A 开始.执行后续任务0_A 结束.
Round 1:执行条件任务 1_B 开始.执行条件任务 1_A 开始.执行条件任务 1_B 结束! 后续执行 1_B,其它任务不执行执行后续任务1_B 开始.执行后续任务1_B 结束.
Round 2:执行条件任务 2_A 开始.执行条件任务 2_B 开始.执行条件任务 2_A 结束! 后续执行 2_A,其它任务不执行执行后续任务2_A 开始.执行后续任务2_A 结束.解读 对于round0: 1、A和B条件任务均执行但B任务提前完成此时A任务未完成部分抛弃 2、执行后续B任务 对于round1: 1、A和B条件任务均执行但A任务提前完成此时B任务未完成部分抛弃 2、执行后续A任务. 对于round2: 1、A和B条件任务均执行但A任务提前完成此时B任务未完成部分抛弃 2、执行后续A任务.
从上面可以清晰看到tokio的select!中“抛弃”和“后续执行”策略。