【Python程序开发系列】并发执行协程任务超时的解决方案(案例分析)

一、问题

       假如我在利用协程并发执行任务的时候,会出现有些任务特别耗时,从而导致程序运行卡住,我们想跳过这些执行特别耗时的任务,只返回不超时的任务结果该怎么解决? 

二、实现过程

2.1 情景

假如我有四个任务需要并发执行:

import asyncioasync def process_task1(task):try:# 模拟一个耗时的协程任务await asyncio.sleep(8)print(f"Task {task} completed")except:# 任务超时,跳过当前任务print(f"Task {task} timed out, skipping...")finally:return 1async def process_task2(task):try:# 模拟一个耗时的协程任务await asyncio.sleep(6)print(f"Task {task} completed")except:# 任务超时,跳过当前任务print(f"Task {task} timed out, skipping...")finally:return 2async def process_task3(task):try:# 模拟一个耗时的协程任务await asyncio.sleep(2)print(f"Task {task} completed")except:# 任务超时,跳过当前任务print(f"Task {task} timed out, skipping...")finally:return 3async def process_task4(task):try:# 模拟一个耗时的协程任务await asyncio.sleep(1)print(f"Task {task} completed")except:# 任务超时,跳过当前任务print(f"Task {task} timed out, skipping...")finally:return 4

第一个任务执行需要8秒,第二个任务执行需要6秒,第三个任务执行需要2秒,第四个任务执行需要1秒。

2.2 处理过程

假如我们用asyncio.gather并发执行四个任务,会等四个任务全部执行完成才会返回结果,这将非常耗时,如果有一个任务执行时间是几千秒,程序会卡在那里不动。

async def main():# 创建任务列表tasks = [process_task1(1), process_task2(2), process_task3(3), process_task4(4)]tasks = [asyncio.ensure_future(task) for task in tasks]res = await asyncio.gather(*tasks)print(res)# 运行主程序
asyncio.run(main())

这时候,我们可以使用asyncio.wait() 来处理并发任务。asyncio.wait() 是 asyncio 库中的一个函数,用于等待一组协程任务完成。它返回两个集合:已完成的任务集合和未完成的任务集合。并发执行4个任务,通过设置超时时间,对于超过4秒的任务就不会完成,未超过4秒的任务会完成。

async def main():# 创建任务列表tasks = [process_task1(1), process_task2(2), process_task3(3), process_task4(4)]tasks = [asyncio.ensure_future(task) for task in tasks]# 设置超时时间为4秒timeout = 4# 并发执行任务,并设置超时时间done, pending = await asyncio.wait(tasks, timeout=timeout)completed = []# 处理已完成的任务、未超时的任务for task in done:print("Completed task:", task)result = task.result()print(result)completed.append(result)print(completed)# 处理未完成的任务、超时的任务,直接取消任务for task in pending:print("Pending task:", task)task.cancel()  # 会抛出异常,执行这个任务的except代码,打印出Task 2 timed out, skipping...Task 1 timed out, skipping...# 或者处理未完成的任务:不考虑时间,继续等待他们全部完成not_completed = await asyncio.gather(*pending)print(not_completed)# 整合结果res = completed + not_completedprint(res)
# 运行主程序
asyncio.run(main())

对于已完成的任务集合,使用 for 循环遍历每个任务,并对其进行相应的处理。例如,你可以获取任务的结果、处理返回的数据或执行其他操作。

对于未完成的任务集合,可以选择等待它们完成,或者取消这些任务。如果你希望等待这些任务完成,可以继续使用 await asyncio.wait() 或其他等待任务完成的方法如 asyncio.gather() 函数。如果你希望取消这些任务,可以使用 task.cancel() 方法取消任务的执行。请注意,取消任务只能在任务未开始执行或者支持取消的情况下生效。

三、结果

运行结果:

图片

作者简介:

读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信。

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

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

相关文章

Python学习之路-Flask项目:开发准备

Python学习之路-Flask项目:开发准备 前言 前面几篇学习了Flask的基础知识,从今天开始开发一个个人博客项目来练练手。 项目分析 关于个人博客的Web项目,主要为自己提供一个记录与技术输出的平台。以个人编写或者转载优秀的文章作为博文的主要来源基于…

MySQL--删除数据表(6)

MySQL中删除数据表是非常容易操作的,但是你在进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失。 语法 以下为删除 MySQL 数据表的通用语法: DROP TABLE table_name ; -- 直接删除表,不检查是否存在 或 DROP…

力(FFT,acwing2313)

题目路径: https://www.acwing.com/problem/content/2315/ 思路:

Python可执行文件的转换

当开发者向普通用户分享程序时,为了方便用户在未安装Python环境的情况 下能够正常运行,需要将开发好的程序进行打包,转换成用户可运行的文件类 型。本节将介绍在Windows和Linux两种系统下,将Python类型的文件转换成可执 行文件的方…

netty: MessageToMessageCodec的用法

一、定义类,继承MessageToMessageCodec,重写encode和decode方法 package cn.edu.tju;import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToMes…

编码风格之(5)GNU软件编码风格(3)

GNU软件编码标准风格(3) Author:Onceday Date: 2024年1月21日 漫漫长路,才刚刚开始… 本文主要翻译自《GNU编码标准》(GNU Coding Standards)一文。 参考文档: Linux kernel coding style — The Linux Kernel documentationGNU Coding Standard…

kotlin $ (字符串模版)的使用

$ 在kotlin 中当做字符串模版使用,作用就是在字符串里面识别自己定义的字符 例如打印一个字符 这个时候编译就提示我们使用字符串模版的是个 $ 的作用就是识别字符串里面的i 字数有点少了,在写一个demo private fun String.appendArchive(): String …

java-集合-List集合

List集合 java.util.List接口,继承自Collection. List集合是可重复集,并且有序,提供了一套可以通过下标操作元素的方法 常用实现类: - java.util.ArrayList:内部使用数组实现,查询性能更好. - java.util.LinkedList:内部使用链表实现,首尾增删元素性能更好. List集合常见方法…

云手机与实体手机的对比

在数字化时代,云手机作为一种虚拟手机在云端服务器上运行,与传统的实体手机相比存在诸多差异。让我们深入探讨云手机与实体手机之间的区别,以便更好地了解它们的特点和优势。 外观上的差异 实体手机具有实际的外观和重量,占据一定…

Spring Boot整合XXL-Job

Spring Boot整合XXL-Job 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将探讨如何在Spring Boot项目中整合XXL-Job,一个分布式任务…

编译安装Nginx和使用五种算法实现Nginx反向代理负载均衡

目录 Ubuntu中安装Nginx 概念介绍 负载均衡 几种负载均衡算法 反向代理 环境规划 配置反向代理 加权负载均衡(Weighted Load Balancing) 轮询(Round Robin) IP 哈希(IP Hash) 最少连接&#xff…

多维时序 | Matlab实现EVO-TCN-Multihead-Attention能量谷算法优化时间卷积网络结合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现EVO-TCN-Multihead-Attention能量谷算法优化时间卷积网络结合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现EVO-TCN-Multihead-Attention能量谷算法优化时间卷积网络结合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资…

Spring5系列学习文章分享---第四篇(JdbcTemplate+概念配置+增删改查数据+批量操作 )

目录 JdbcTemplateJdbcTemplate(概念和准备)JdbcTemplate 操作数据库(新增update)JdbcTemplate 操作数据库(修改和删除update)JdbcTemplate 操作数据库(查询返回某个值queryForObject&#xff0…

shopee的AI学习之路——GPTs通过AdInteli 广告变现

GPTs|AdInteli 广告变现 一、什么是 AdInteli AdIntelli 是一个旨在为生成 GPTs 接入广告并实现变现的平台。它连接了全球最大的广告联盟,允许广告商进行竞价,确保展示最有价值的广告。AdIntelli 采用 AI 驱动的收入生成技术,优化广告选择。…

安卓MediaRecorder(4)视频采集编码写入详细源码分析

文章目录 前言视频采集视频编码视频编码写入结语 本文首发地址 https://blog.csdn.net/CSqingchen/article/details/134896821 最新更新地址 https://gitee.com/chenjim/chenjimblog 前言 通过 文2 我们知道了 MediaRecorder 各个接口 Framework 中的实现。 通过 文3 我们 知道…

<网络安全>《5 网络安全产品之网关》

1 基础概念 网关(Gateway)又称网间连接器、协议转换器。 网关在网络层以上实现网络互连,是复杂的网络互连设备,仅用于两个高层协议不同的网络互连。 网关既可以用于广域网互连,也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或…

《游戏-03_3D-开发》之—新输入系统人物移动攻击连击

本次修改unity的新输入输出系统。本次修改unity需要重启,请先保存项目, 点击加号起名为MyCtrl, 点击加号设置为一轴的, 继续设置W键, 保存 生成自动脚本, 修改MyPlayer代码: using UnityEngine;…

华为产业链之车载激光雷达

一、智能汽车 NOA 加快普及,L3 上路利好智能感知硬件 1、感知层是 ADAS 最重要的一环 先进驾驶辅助系统 (ADAS, Advanced driver-assistance system)分“感知层、决策层、执行层”三个层级,其中感知层是最重要的一环…

Python数据分析:数据处理

数据处理是指对原始数据进行清洗、转换、整合和分析,以便从中提取有价值的信息。 常见的数据处理步骤包括: 数据清洗:去除缺失值、异常值和重复值。数据转换:对数据进行格式转换、归一化、标准化等操作。数据整合:将…

vue创建前端项目

背景 项目中需要用到前端技术,通过技术调研和团队分析,则采用vue作为前端主要技术栈。 问题 安装好后vue,按理说就可以创建vue项目 vue init webpack 项目名称 npm install,使用vue-cli脚手架搭建项目卡在sill idealTree buil…