【测试平台系列】如何停止测试任务执行

news2024/12/20 2:23:28

今天我们就玩点好玩的,和大家一起探讨:怎么停止一段python代码。之后我们将会运用到pity之中。

知识要点

本文需要大家对asyncio相关知识有一些了解,至于原理方面,大家可以自行查阅,因为我也没细看。

为什么要做这个?

针对测试任务执行非常久的时候,看起来会是阻塞的情况,举个例子:

某个python脚本里面写了time.sleep(1000),导致你的case一直好像没有执行完成,那我们想结束它,该咋整呢?

今天博主要聊的就是这方面的内容。

先看看"难题"

我们来写一个简单的demo。

我们先定义一个异步无限循环的方法,让它每隔一秒就打印一行内容

import asyncio


async def run():
    while True:
        print("still alive")
        await asyncio.sleep(1)

试想一下,如果这个方法开启了,不结束它,它是不是会一直打印下去?没错,我们先试试直接运行之:


很显然,它是绝对不会停止的,除非你关闭这个py程序。

我们把它想象成同步方法,是不是也会遇到这个困难:

import time


def run():
    time.sleep(10000)
    
if __name__ == "__main__":
    run()
    print("done")

可以发现run一旦开始,它就阻塞了整个程序,下面的done必须要等run结束了才能打印出来。

怎么停止run

我们都知道,在python3.4以后新增了异步编程相关的概念,最初是由@coroutine这样的装饰器放到方法上,把方法标注为异步方法,后面直接从语言层面支持了异步方法定义(async),那其实里面还有很多我们不太常用的部分,比如今天要说的create_task。

我们改写下方法

import asyncio


async def run():
    while True:
        print("still alive")
        await asyncio.sleep(1)
        
        
async def main():
    await asyncio.create_task(run())


if __name__ == "__main__":
    asyncio.run(main())

这次我们包了一层方法,利用asyncio.create_task来创建异步任务,create_task接收一个coroutine并执行。

执行之后,可以发现这个和上面的情况,任务也会一直进行下去。

我们继续下一步改造:


我们去掉await,可以看到run方法确实执行了,但是still alive只打印了一次就结束了。

我对它的理解是,虽然create_task创建了一个异步任务,但没说要await,也就是说没有说要等它结束。

想象一下这些异步任务都由一个事件循环控制,当你执行main(main本身也是一个异步任务)的时候,asyncio.run默认是要执行到main方法执行完毕的,也就是说,现在事件循环等待main方法执行完毕,main方法里面又创建了一个异步任务,但没有强调需要该任务完成,创建完毕后,由于main任务已经完成了,就导致整个事件结束了。

梳理一下:

  • 有await

线程开启 -> 执行main -> main里面创建异步任务run -> 等待异步任务run(一直等一直等)

由于主线程没有结束,所以整个python程序一直在等待异步任务执行完毕,毕竟它是死循环,所以会一直等下去。

  • 无await

线程开启 -> 执行main -> main里面创建异步任务run -> 不等待异步任务run -> main方法结束 -> 线程结束 -> 程序退出

以上都是个人结合go的goroutine给出的理解。肯定会有一些差别的地方。

  • 再次改造

其实create_task会返回一个task对象,里面有done和cancel方法,也就是说咱们可以取消他也可以完成他。

import asyncio


async def run():
    while True:
        print("still alive")
        await asyncio.sleep(1)


async def main():
    task = asyncio.create_task(run())
    await asyncio.sleep(2)
    # 2秒后,就停掉这个任务
    task.cancel()
    print("task任务结束了,main也即将完成,整个程序即将退出")


if __name__ == "__main__":
    asyncio.run(main())

一旦调用了create_task,那么任务就已经开始了,接着我们用await让main等待2秒,再调用task.cancel方法就可以取消这个task,这样所有事件都结束,程序也会退出了。

看看gif:

这时候有的同学可能会问了,await2秒以后,不管你是否调用cancel,因为没有await task,所以程序照样会退出啊,没法证明task真的被cancel了。

仔细想想,确实说的有道理。那我们再来改造下:

可以看到,这个task死之前还做了垂死挣扎!!!

加上await

可以看到加上await之后,它还是不会停止。

那我们加上cancel试试:

很遗憾,报错了~~~不过没关系,我们继续改下。只需要加上异常处理,就可以完美实现2秒后自动取消任务了。

但这个例子依然不是很帅,如果只是想控制异步任务的执行时间,那我们可以用wait_for:

import asyncio


async def run():
    while True:
        print("still alive")
        await asyncio.sleep(1)


async def main():
    try:
        await asyncio.wait_for(run(), 2)
    except asyncio.TimeoutError:
        print("run方法超过2秒仍未执行完成")


if __name__ == "__main__":
    asyncio.run(main())

这样2秒后,任务还没结束也不会继续执行了。


去掉死循环以后,任务会在2秒内完成(因为只等待1秒),这时候就可以看到timeout异常不会被触发。

今天的内容就介绍到这了,异步还有挺多玩法的,我也不是很清楚,大家可以互相交流交流~~~

最后:下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取 【保证100%免费】

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

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

相关文章

Spring使用mongoDB步骤

1. 在Linux系统使用docker安装mongoDB 1.1. 安装 在docker运行的情况下,执行下述命令。 docker run \ -itd \ --name mongoDB \ -v mongoDB_db:/data/db \ -p 27017:27017 \ mongo:4.4 \ --auth执行docker ps后,出现下列行,即表示mongoDB安…

【项目精选】网络考试系统的设计与实现(源码+视频+论文)

点击下载源码 网络考试系统主要用于实现高校在线考试,基本功能包括:自动组卷、试卷发布、试卷批阅、试卷成绩统计等。本系统结构如下: (1)学生端: 登录模块:登录功能; 网络考试模块…

gdb openocd jlink arm-a9调试

连接关系是这样的:gdb —> openocd —>(这里需要两个xx.cfg配置文件) jlink —> arm-a9板子 具体流程是这样的: 给jlink(硬件调试器)安装驱动,用USB Driver Tool这个软件,…

02.24:图片的风格转换

Github网址:https://github.com/lengstrom/fast-style-transfer 在anaconda prompt中切换环境命令:activate 环境名 列出所有环境名:conda info --envs 安装环境:conda create -n 环境名 pythonx.x.x 删除某环境:co…

Spring Cloud Nacos源码讲解(八)- Nacos客户端服务订阅的事件机制剖析

Nacos客户端服务订阅的事件机制剖析 ​ 上次我们已经分析了Nacos客户端订阅的核心流程:Nacos客户端通过一个定时任务,每6秒从注册中心获取实例列表,当发现实例发生变化时,发布变更事件,订阅者进行业务处理&#xff0c…

WAF渗透攻防实践(16)

预备知识 WAF:WEB攻击一直是黑客攻击的主流手段,WAF作为网站安全基础设施的标配。Web Application Firewall,Web应用防火墙,通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的产品。 Nginx:Nginx 是…

京东10年经验测试工程师,整理出来的自动化测试学习路线,写给还在迷茫的你们

1、学习python基本语法。 2、上w3school这个网站(2019年4月6日补充:网址是http://www.w3schools.com。但是现在这个网站被墙,而且出现众多山寨站点。。。这个网站的特点是你可以在网页上做一些练习,比如他教html的时候会让读者直…

Word的多级列表及自定义带级联编号有序列表的方法

1.多级列表的应用 输入列表时,列表项目符号或编号不应手动输入。可在输入文字后将光标放在文字所在段落,点击开始面板段落工具组的编号命令或者多级列表命令来生成编号。由于多级列表命令完全可以覆盖编号命令,且格式调整功能更强大&#xf…

ES数据迁移_snapshot(不需要安装其他软件)

参考文章: 三种常用的 Elasticsearch 数据迁移方案ES基于Snapshot(快照)的数据备份和还原CDH修改ElasticSearch配置文件不生效问题 目录1、更改老ES和新ES的config/elasticsearch.yml2、重启老ES,在老ES执行Postman中创建备份目录…

第45届世界技能大赛“网络安全”赛项浙江省选拔赛竞赛任务书

第45届世界技能大赛浙江省选拔赛竞赛任务书 一、竞赛时间 8:00-17:00,共计9小时。 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 模块A 任务1 数据库安全加固 8:00-10:00 50 任务2 文件MD5校验 50 任务3 Linux系统服务渗透测试及安全加…

洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk

最后水一篇水题题解(实在太水了) # [USACO1.3]混合牛奶 Mixing Milk ## 题目描述 由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要。帮助 Marry 乳业找到最优的牛奶采购方案。 Marry 乳业从一些奶农手…

【RabbitMQ笔记03】消息队列RabbitMQ七种模式之WorkQueues工作队列模式

这篇文章,主要介绍消息队列RabbitMQ七种模式之WorkQueues工作队列模式。 目录 一、工作队列模式 1.1、什么是Work Queues模式 1.2、工作队列模式的使用 (1)引入依赖 (2)编写生产者 (3)编写…

如何提高您的网站速度更好的符合SEO规范

如果觉得文章对你有用请点赞与关注,每一份支持都是我坚持更新更优质内容的动力!!!慢速网站会受到用户和搜索引擎的惩罚。用户跳出,搜索引擎可以降低您的排名。为了针对搜索引擎和用户优化您的网站,您的网站…

Golang学习Day3

😋 大家好,我是YAy_17,是一枚爱好网安的小白。 本人水平有限,欢迎各位师傅指点,欢迎关注 😁,一起学习 💗 ,一起进步 ⭐ 。 ⭐ 此后如竟没有炬火,我便是唯一的…

Mybatis中的动态SQL

Mybatis中的动态SQL 当存在多条件查询的SQL时,当用户某个条件的属性没有写时,就会存在问题,在test中则不能很好的运行 所以Mybatis提出了动态SQL。 即判断用户是否输入了某个属性 动态SQL中的一些问题 方法一 这个里的and是为了确保if条…

三天吃透MySQL八股文(2023最新整理)

本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…

口红品牌管理APP

伴随着科技的发展,多条产业和产品已经走上了智能化的道路,口红也是如此,口红的品牌众多,格式,色号更是令人难以区分,为了便于顾客选购和产品的科技化整理销售,利用课程所学知识,基于…

服务搭建篇(六) Kafka + Zookeeper集群搭建

一.Zookeeper 1.什么是Zookeeper ZooKeeper 是一个开源的分布式协调框架,是Apache Hadoop 的一个子项目,主要 用来解决分布式集群中应用系统的一致性问题。Zookeeper 的设计目标是将那些复杂且容 易出错的分布式一致性服务封装起来,构成一个…

linux pybind11 python c++ 混合编程(包括具体版本匹配的设置)

pybind11的处理过程 我首先安装了pybind,参考了许多教程,但很多教程的貌似都来自微软导出pyd的方法,但是实际上linux下导出so文件而非pyd文件,后续运行的实例来自https://github.com/tdegeus/pybind11_examples(代码就…

设计模式(十一)----结构型模式之装饰者模式

1、概述 我们先来看一个快餐店的例子。 快餐店有炒面、炒饭这些快餐,可以额外附加鸡蛋、火腿、培根这些配菜,当然加配菜需要额外加钱,每个配菜的价钱通常不太一样,那么计算总价就会显得比较麻烦。 使用继承的方式存在的问题&…