异步任务运行过程中,如何取消一个任务的运行?

1. 异步任务运行过程中,如何取消一个任务的运行?

use tokio::sync::broadcast;
use tokio::task;
use tokio::time::{sleep, Duration};#[tokio::main]
async fn main() {// 创建一个广播频道,用于通知任务取消let (tx, _) = broadcast::channel(16);// 启动多个异步任务let mut handles = Vec::new();for i in 0..3 {let mut rx = tx.subscribe();let handle = task::spawn(async move {tokio::select! {_ = async {loop {sleep(Duration::from_secs(1)).await;println!("Task {} running", i);}} => {println!("Task {} completed", i);}_ = rx.recv() => {println!("Task {} aborted", i);}}});handles.push(handle);}// 等待一段时间,然后发送取消信号sleep(Duration::from_secs(3)).await;let _ = tx.send(());// 等待所有任务完成for handle in handles {let _ = handle.await;}println!("All tasks finished.");
}

如上代码所示,我们创建了一个广播频道broadcast::channel(16),用于通知任务取消。在每个任务中,我们使用tokio::select!宏来监听两个异步任务:一个是任务的主体逻辑,另一个是接收取消信号。当接收到取消信号时,任务会打印Task {} aborted并退出。在代码片段中的sleep(Duration::from_secs(3)).await;这一块逻辑,完全可以替换为其他逻辑,比如用户输入、网络请求等,使得任务取消更加灵活。

2. 更近一步,多个异步任务执行的时候,其中一个任务失败了,如何取消其他任务的执行?

第一个想法是使用tokio::try_join! + tokio::spawn

use std::time::Duration;async fn do_stuff_async() -> Result<(), &'static str> {println!("do some async work");Err("do_stuff_async failed")
}async fn more_async_work() -> Result<(), &'static str> {tokio::time::sleep(Duration::from_secs(3)).await;for i in 0..50000 {println!("more here {}", i);}Ok(())
}#[tokio::main]
async fn main() {let f1 = tokio::spawn(do_stuff_async());let f2 = tokio::spawn(more_async_work());let res = tokio::try_join!(f1, f2);match res {Ok((first, second)) => {println!("first = {:?}, second = {:?}", first, second);}Err(err) => {println!("processing failed; error = {}", err);}}
}

这段代码中,我们创建了两个异步任务f1f2,分别执行do_stuff_asyncmore_async_work函数。在f1任务中,我们在异步函数do_stuff_async中模拟了一个失败的情况,当异步函数返回Err时,我们直接返回这个错误,但悲剧的是这个任务的失败并不会影响其他异步任务的执行。想实现预期的效果,貌似只能通过在异步函数中使用tokio::select!宏来监听取消信号,然后在任务失败时发送取消信号。如:try_join! on parallel tasks讨论的那样。

3. tokio::select!

tokio::select!如果一个分支如果正在执行且未执行结束的时候,另一个分支执行结束了,如_ = rx.recv() => {},那正在执行的其他分支的代码逻辑是不是依旧会继续执行?

在使用tokio::select!宏时,它允许同时等待多个操作,比如异步操作的完成,并且当其中一个操作完成时,select!宏会立即处理完成的操作。关于当一个分支(比如一个异步接收操作_ = rx.recv())完成时,其他正在执行但尚未完成的分支会发生什么,这里有几个关键点需要理解:

  1. 立即响应:当使用tokio::select!时,一旦其中一个分支完成,select!宏会立即处理这个分支。这意味着,如果_ = rx.recv()这个接收操作完成了,它会立即被处理。

  2. 取消其他分支:对于其他还在执行但未完成的分支,tokio::select!会尝试取消它们。这是通过FutureDrop特性实现的,当一个Future被丢弃时,它有机会进行清理工作,这可能包括取消正在进行的操作。不过,这取决于具体的Future实现是否支持取消。

  3. 执行逻辑:如果一个分支正在执行且未执行结束的时候,另一个分支执行结束了,那么正在执行的分支会被select!尝试取消。但是,如果这个分支的逻辑包含了无法取消的操作或者执行到了一个不可中断的点,那么这部分代码的逻辑可能会继续执行到下一个可以取消的点或执行完毕。

  4. 编写可取消的代码:在使用tokio::select!时,重要的是要意识到,你的异步代码可能会被取消,因此编写可取消的异步代码是一个好习惯。这意味着应该避免长时间运行的同步代码块,并且定期检查操作是否应该被取消。

总结来说,当使用tokio::select!时,如果一个分支完成了,其他正在执行的分支会被尝试取消。但是,这取决于这些分支的具体实现,以及它们是否支持取消和如何响应取消请求。

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

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

相关文章

高质量数据不够用,合成数据是打开 AGI 大门的金钥匙吗?

编者按&#xff1a; 人工智能技术的发展离不开高质量数据的支持。然而&#xff0c;现有可用的高质量数据资源已日渐接近枯竭边缘。如何解决训练数据短缺的问题&#xff0c;是当前人工智能领域亟待解决的一个较为棘手的问题。 本期文章探讨了一种经实践可行的解决方案 —— 合成…

互联网医院系统源码解析:如何打造智能数字药店APP?

在互联网技术飞速发展的今天&#xff0c;医疗行业也在不断与之融合&#xff0c;互联网医院系统应运而生。特别是智能数字药店APP的兴起&#xff0c;使得医疗服务变得更加便捷、高效。本文将深入解析互联网医院系统源码&#xff0c;探讨如何打造一个智能的数字药店APP。 一、互…

64、基于去噪卷积神经网络的彩色图像去噪(matlab)

1、基于去噪卷积神经网络的彩色图像去噪的原理及流程 基于去噪卷积神经网络的彩色图像去噪是一种基于深度学习的图像处理技术&#xff0c;可以有效地去除图像中的噪声&#xff0c;提高图像的质量。下面是在Matlab中实现基于去噪卷积神经网络的彩色图像去噪的原理及流程&#x…

电工电子革新风暴:在线电路仿真软件重塑行业格局

随着科技的不断进步&#xff0c;电工电子行业正迎来一场由在线电路仿真软件引领的革新风暴。这些功能强大的软件工具不仅极大地提高了电路设计的效率&#xff0c;更为整个行业带来了前所未有的冲击和机遇。 仿真软件&#xff1a;电工电子行业的“隐形推手” 在线电路仿真软件…

Hi3861 OpenHarmony嵌入式应用入门--TCP Server

本篇使用的是lwip编写tcp服务端。需要提前准备好一个PARAM_HOTSPOT_SSID宏定义的热点&#xff0c;并且密码为PARAM_HOTSPOT_PSK LwIP简介 LwIP是什么&#xff1f; A Lightweight TCP/IP stack 一个轻量级的TCP/IP协议栈 详细介绍请参考LwIP项目官网&#xff1a;lwIP - A Li…

【机器学习】在【Pycharm】中的实践教程:使用【逻辑回归模型】进行【乳腺癌检测】

目录 案例背景 具体问题 1. 环境准备 小李的理解 知识点 2. 数据准备 2.1 导入必要的库和数据集 小李的理解 知识点 2.2 数据集基本信息 小李的理解 知识点 注意事项 3. 数据预处理 3.1 划分训练集和测试集 小李的理解 知识点 注意事项 3.2 数据标准化 小李…

前端Web开发HTML5+CSS3+移动web视频教程 Day3 CSS 第1天

P29 - P43 从此开始进入 CSS 的学习。前面都是 HTML 的学习。 CSS 的作用&#xff1a;美化。 HTML 只是规定了网页内容有哪些&#xff0c;在网页中显示的位置默认是从上到下显示&#xff0c;还带有默认效果&#xff0c;比如超链接有颜色有下划线&#xff0c;无序列表有小圆点…

MeEdu网校系统搜索功能问题处理

MeEdu通过 MeiliSearch 实现全文搜索服务。 一、下载 MeiliSearch 程序 https://github.com/meilisearch/MeiliSearch/releases/tag/v0.24.0 只能下载 v0.24.0 版本&#xff0c;其版本不支持 下载 meilisearch-linux-amd64就可以了 二、上传 MeiliSearch 三、启动命令如下…

华为云安全防护,九河云综合分解优劣势分析

随着全球化的发展&#xff0c;越来越多的企业开始寻求在国际市场上扩展业务&#xff0c;这一趋势被称为企业出海。然而&#xff0c;企业在海外扩张面临诸多隐患与安全挑战&#xff0c;其中因为地域的不同&#xff0c;在安全性方面与国内相比会变得薄弱&#xff0c;从而导致被黑…

antd+vue——实现table组件跨页多选,已选择数据禁止第二次重复选择

需求场景&#xff1a;点击【新增】按钮可以在分页弹窗中跨页多选选择数据后添加到页面中&#xff0c;再次点击【新增】&#xff0c;已经选择过的数据则置灰不让重复选择。 选择后&#xff0c;置灰 点击【确定】数据添加到页面中&#xff0c;可再次点击【新增】进行添加数据 …

FastGPT 手动部署错误:MongooseServerSelectionError: getaddrinfo EAI_AGAIN mongo

在运行 FastGPT 时&#xff0c;mongodb 报如下错误&#xff1a; MongooseServerSelectionError: getaddrinfo EAI_AGAIN mongo 这是因为 mongo 没有解析出来&#xff0c;在 hosts 文件中添加如下信息&#xff1a; 127.0.0.1 mongo 重新运行 FastGPT 即可。 参考链接&#xff…

基于web的产品管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于web的产品管理系统,java项目。 ecli…

被⽹络罪犯利⽤的5⼤ChatGPT越狱提⽰

⾃ChatGPT发布的近18个月以来&#xff0c;⽹络罪犯们已经能够利⽤⽣成式AI进⾏攻击。OpenAI在其内容政策中制定了限制措施&#xff0c;以阻⽌⽣成恶意内容。作为回应&#xff0c;攻击者们创建了⾃⼰的⽣成式AI平台&#xff0c;如 WormGPT和FraudGPT&#xff0c;并且他们还分享了…

Jmeter下载、安装及配置

1 Jmeter介绍 Jmeter是进行负载测试的工具&#xff0c;可以在任何支持Java虚拟机环境的平台上运行&#xff0c;比如Windows、Linux、Mac。 Jmeter模拟一组用户向目标服务器发送请求&#xff0c;并统计目标服务器的性能信息&#xff0c;比如CPU、memory usage。 2 Jmeter下载 …

应用密码学—(扩展)欧几里得、DES、RSA、SHA-1算法

1. 欧几里得算法 1.1 分析算法的实现原理 欧几里德&#xff08;Euclid&#xff09;算法&#xff0c;也既常说的“辗转相除法”&#xff0c;公式为gcd(m, n) { return gcd(n, m%n); }&#xff0c;对于任意两个正整数m、n&#xff0c;每次求的一个数字r m % n&#xff0c;然后把…

C语言快速学习笔记

学习网站&#xff1a;C 语言教程 | 菜鸟教程 (runoob.com)C 语言教程 | 菜鸟教程 (runoob.com)C 语言教程 | 菜鸟教程 (runoob.com) 这个网站知识完整&#xff0c;讲解清晰。 在线C语言编程工具&#xff1a;菜鸟教程在线编辑器 (runoob.com) 国外学习网站&#xff1a;C语言介…

难道 Java 已经过时了?

当一门技术已经存在许多年了&#xff0c;它可能会失去竞争力&#xff0c;而后黯然退场&#xff0c;默默地离开&#xff0c;这对大部分的人来说就已经算是过时了。 Java 于 1995 年正式上线&#xff0c;至今已经走过了 27 个年头&#xff0c;在众多编程技术里算是年龄比较大的语…

【C++】开源:量化金融计算库QuantLib配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍量化交易库QuantLib配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#…

【高中数学/基本不等式】已知:a,b皆为正实数,且3a+2b=10 求:3a开方+2b开方的最大值?

【题目】 已知&#xff1a;a,b皆为正实数&#xff0c;且3a2b10 求&#xff1a;3a开方2b开方的最大值&#xff1f; 【解答】 解法一&#xff1a;&#xff08;基本不等式&#xff09; 原式^23a2*根号下(3a*2b)2b102*根号下(3a*2b)<103a2b101020 答&#xff1a;3a开方2b…

[漏洞复现] MetInfo5.0.4文件包含漏洞

[漏洞复现] MetInfo5.0.4文件包含漏洞 MetInfo5.0.4 漏洞代码审计 漏洞出现在about/index.php中&#xff0c;因为利用了动态地址&#xff0c;所以存在漏洞。 漏洞检查语句&#xff08;&#xff01;192.168.109.100是我的服务器ip&#xff0c;需要换成自己的&#xff09;&…