【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,一经查实,立即删除!

相关文章

MySQL--删除数据表(6)

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

力(FFT,acwing2313)

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

Python可执行文件的转换

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

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

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

云手机与实体手机的对比

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

编译安装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 驱动的收入生成技术,优化广告选择。…

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

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

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

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

vue创建前端项目

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

C#hybridCLR热更新方案初探

前言 暂时处于初步研究状态,目前的框架使用还是尚少,本篇文章旨在同步给大家大概的使用流程和使用心得,在初步建立新项目时可以适当考虑。 介绍 热更新 与强制更新相对应,移动平台上App的可执行程序没有发生变化,仅…

[Go]认识Beego框架

对比Gin的简洁,自己之前基于Gin撸了一个架子,确实比beego目录看着舒服多了,不过最近接触到beego的项目,beego的bee工具使用还是很方便,来简单梳理下细节; Beego是一个开源的Go语言Web应用框架,…

摄像机视角的切换_unity基础开发教程

摄像机视角的切换 前言一、场景搭建二、脚本编辑三、脚本挂载四、运行效果结语 前言 我们在游戏中经常可以看到游戏视角的切换,今天我们就做一个视角切换的小demo,学会之后可以将其融入到自己的游戏制作当中。 话不多说,我们现在开始&#xf…

eNSP学习——理解交换机Hybird接口的应用

目录 原理概述 实验内容 实验目的 实验步骤 实验拓扑 实验编址 实验步骤 基本配置(此处仅以PC1为例) 实现组内通信、组间间隔 实现网络管理员对所有网络的访问 原理概述 Hybrid接口既可以连接普通终端的接入链路又可以连接交换机间的干道…

Word中插入公式并引用

1、如何插入公式 在word中,键入快捷键 “alt” + “=”,即可快速插入一个公式,并立即编辑。 2、利用表格框住公式 新建一个 1 行 3 列的表格,总宽度为页面宽度,第一个单元格和最后一个单元格都保持在 2.25cm,中间尽可能长。我设置的这个数值比较合理。 记住,要把表格…

初识人工智能,一文读懂机器学习之逻辑回归知识文集(4)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

使用Linux SDK客户端向AWS Iot发送数据

参考链接: https://ap-southeast-1.console.aws.amazon.com/iot/home?regionap-southeast-1#/test 此篇文章用于测试,使用Linux SDK客户端向AWS Iot发送数据,准备环境如下: 1、客户端环境准备 1.1 客户端操作系统 虚拟机一台…

ifconfig 主机ip url记录

ifconfig 容器Pods相关主机与url信息 一文搞懂网络知识,IP、子网掩码、网关、DNS、端口号_关于ip,网关。端口-CSDN博客 计算机网络知识之URL、IP、子网掩码、端口号_ip地址和url-CSDN博客 阅读看下以上文章 由此可知 1.主机ip 10.129.22.124 10.129.22 是网段…