自动化测试提速必备 - 并发编程

news2024/11/25 6:55:47

在自动化测试领域,多线程和多进程技术被广泛应用于提高测试的执行效率和性能。通过并发运行测试用例,可以显著缩短测试周期,特别是在面对大量测试用例或者需要在多个环境中进行测试时尤为重要。 


 

在实际的自动化测试中,我们经常碰到类似的需求:

  • 100条自动化测试用例,采用默认的依次执行方式,所需要的时间竟然高达1个小时,我们需要想办法对其进行时间上的优化

  • App自动化测试中,我们需要同时对多台测试机进行同时测试,以满足我们对于兼容性测试的需求

  • 自动化测试中,我们需要额外监控应用程序/测试机的性能(比如CPU、内存的使用情况),监控不能干扰主测试流程

在这个时候往往我们需要使用并发编程的技术-多线程和多进程,通过并发执行测试用例,可以显著缩短自动化测试时间,同时也能实现在多个环境中同时执行测试的效果。

那么到底什么是多进程和多线程,以及什么时候选择多进程什么时候选择多线程呢?

Python多线程

在计算机中线程是执行中的最小单位。一个进程中可以包含多个线程,它们共享进程的资源,包括内存空间和打开的文件。每个线程都有自己的执行路径,可以独立执行任务。线程的创建和管理由操作系统负责,而不同的操作系统可能对线程有不同的实现方式。

Python提供了threading模块来支持多线程编程。通过threading模块,我们可以创建Thread类的实例,并传入一个函数作为线程的执行体。例如:

from threading import Thread
def worker(money):    print("开始干活")    print(f"拿到{money}块工资")
# 通过target指定线程具体执行的工作-传入对应函数,args参数执行传入函数的参数,需要注意这里是元组类型的thread = Thread(target=worker,args=(100,))# 启动线程thread.start()# 等待线程执行结束thread.join()
多线程GIL锁的问题

我们来看以下小案例:

import time
def count(n):    while n > 0:        n -=1
start_time = time.time()count(100000)end_time = time.time()print(end_time-start_time)

该程序在我的四核Intel i5 CPU上执行所需的时间为0.003968954086303711秒

把上述的程序改造成多线程模式:

​​​​​​​

import timefrom threading import Thread
def count(n):    while n > 0:        n -=1
start_time = time.time()# count(100000)t1 = Thread(target=count, args=[100000 // 2])t2 = Thread(target=count, args=[100000 // 2])t1.start()t2.start()t1.join()t2.join()end_time = time.time()print(end_time-start_time)

多线程模式下所需要的时间为:0.005413532257080078秒

此程序中使用了2个线程来执行和上面一样的工作,从结果来看效率没有提高反而降低了。其实这里不管使用多少线程,其结果中效率和2个线程效率几乎一样。

为什么会有这种情况?这一切的罪魁祸首来源于GIL:

全局解释器锁(GIL)是Python解释器中的一个机制,用于保护解释器内部数据结构不受多线程并发访问的影响。GIL确保了在任意时刻只有一个线程在解释器中执行Python字节码。这意味着尽管Python中可以创建多个线程,但在任何给定时刻只有一个线程能够真正执行代码,其他线程会被阻塞。

图片

  • 当线程在运行时,它会持有GIL锁,其他的进程不能持有GIL锁

  • 当线程遇到IO操作时(比如读写磁盘,发送/接收网络数据等)将会释放GIL锁,其他的线程此时可以获取GIL锁

我们可以根据上述知道:即便我们的CPU是多核心,因为Python GIL锁的存在,同一时间只允许执行一个线程,单个时刻也只能使用到1个CPU核心,所以CPU的利用率不高。

多线程适用的场景

在程序运行时候有两种不同类型的计算任务:

CPU密集型计算

CPU密集型计算指的是任务主要耗费CPU资源,而对于其他资源(如内存、磁盘、网络等)的需求相对较少的计算任务。在CPU密集型计算中,程序主要执行大量的计算操作,例如数学运算、图像处理、加密解密、复杂算法等。

IO密集型计算

IO密集型计算指的是任务主要耗费在等待IO操作上,例如磁盘读写、网络通信、数据库查询等。在IO密集型计算中,CPU主要用于处理IO操作的调度和处理。

所以如果是IO密集型计算任务,使用多线程是比较合适的,虽然GIL锁存在导致只能单个线程在CPU内执行,但是在IO处理时不受限制的,IO操作较多时使用多线程依然可以加速任务的执行。

Python多进程

Python中有了多线程,为什么还需要用多进程?

前面我们讲了GIL锁的存在,当多线程遇到了CPU密集型的计算时,反而会降低程序的执行效率

GIL锁同一时间只允许执行一个线程执行,多线程之间还会涉及到上下文切换,上下文切换也需要花费时间

那么什么是多进程呢?

在操作系统中,进程是一个独立运行的程序实例。每个进程都有自己独立的内存空间,一个进程崩溃不会直接影响到其他进程。在多核处理器上,多进程能够实现真正的并行计算,每个进程可以在不同的处理器核心上运行。

Python标准库中的multiprocessing模块能够实现多进程,这个模块提供了与多线程threading模块类似的API。使用multiprocessing,每个Python进程都有自己的Python解释器和内存空间,这样就避开了GIL的限制,能够充分利用多核CPU的计算资源。

​​​​​​​

from multiprocessing import Process
def worker(money):    print("开始干活")    print(f"拿到{money}块工资")
# 通过target指定进程具体执行的工作-传入对应函数,args参数执行传入函数的参数,需要注意这里是元组类型的process = Process(target=worker,args=(100,))# 启动进程process.start()# 等待子进程执行结束process.join()

多进程的主要优势在于能够绕过GIL的限制,利用多核CPU实现真正的并行计算,特别适合处理CPU密集型任务。

其劣势在于运行一个进程消耗的资源比线程多很多,进程间的通讯也是比较复杂(比如需要用到消息队列、管道等机制)

最后总结一句话:对于CPU密集型任务选择多进程,对于IO密集型任务选择多线程。

 

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

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

相关文章

为什么选择成为程序员?

目录 兴趣和热爱高薪和就业机会持续学习和不断成长挑战和乐趣 兴趣和热爱 许多人选择成为程序员可能是热爱,对计算机,以及编程和科技产生了浓厚的兴趣,并且享受着解决每一个技术问题,构建应用程序和探索新技术所带来的乐趣。 谈到…

【多线程】 synchronized关键字 | 可重入锁 | 死锁 | volatile关键字 | 内存可见性问题 |waitnotify方法|

文章目录 synchronized和volatile关键字一、加锁互斥二、synchronized的使用1.修饰实例方法2.修饰类方法 三、可重入锁1.死锁关于死锁哲学家就餐问题如何避免死锁死锁成因的四个必要条件 四、volatile关键字1.保证内存可见性什么是内存可见性问题如何解决Java内存模型JMMvolati…

蓝牙技术在智能硬件中应用火热,你的蓝牙适配测试如何解决?

蓝牙技术在物联网中的应用非常广泛,可以为人们的生活和工作带来更多的便利和智能化体验,主要五大核心应用场景,具体如下: 1、智能家居 通过蓝牙连接智能家居设备,如智能灯泡、智能插座、智能恒温器等,可以…

【PyQt5】环境配置

PyQt5 环境配置 一、前言1.1 PyQt5介绍1.2 PyCharm集成Pyqt5 二、pyqt5安装三、PyQt5-tools工具包安装四、常用工具环境配置4.1、环境变量配置4。2、验证是否安装成功 五、pycharm中设置Qt工具(Qt Designer、PyUIC、PyRcc)5.1、配置Qt Designer5.2、配置…

LangChain的RAG实践

1. 什么是RAG RAG的概念最先在2020年由Facebook的研究人员在论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中提出来。在这篇论文中他们提出了两种记忆类型: 基于预训练模型(当时LLM的概念不像现在这么如日中天&#xff0…

钉钉与金蝶云星空对接集成获取流程实例(宜搭)打通收款退款新增

钉钉与金蝶云星空对接集成获取流程实例(宜搭)打通收款退款新增 接入系统:钉钉 钉钉(DingTalk)是阿里巴巴集团专为中国企业打造的免费沟通和协同的多端平台,提供PC版,Web版和手机版,有…

GD32F470_微波多普勒无线雷达探测器探头传感器模块10.525GHz HB100带底板

2.20 微波多普勒无线雷达传感器 微波运动传感器是利用多普勒雷达原理设计的微波移动物体探测器。不同于一般的红外探测器,微波传感器通过通过检测物体反射的微波来探测物体的运动状况,检测对象将并不会局限于人体,还有很多其他的事物。微波传…

DB schema表中使用全局变量及在DB组件中查询

DB schema表中使用全局变量及在DB组件中查询 规则如下: 使用如下: 如果在unicloud-db组件上不加判断条件,就会报错,并进入到登录页。 那么就会进入到登录页,加上了判断条件,有数据了就不会了。 因为在sc…

java列表排序练习题

1、(模式识别方面:四个连续相等的数)编写下面的方法,测试某个数组是否有四个连续的值相同的数字。 public static boolean isConsecutiveFour(int[] values)编写测试程序,提示用户输入一个整数列表,如果这个列表中有四个连续的具有相同值的数…

Linux的环境搭建

目录 第一步:购买腾讯云轻量级云服务器 Step1:打开腾讯云 ​编辑 Step2:登录腾讯云并完成认证 Step3:选择服务器类型 Step4:选择服务器配置 第二部:下载XShell Step1:打开XShell Step2…

用于扩展Qt自身的插件(下)

扩展Qt自身的插件 引言必须满足项创建插件示例代码生成插件配置加载插件的环境创建使用插件的项目配置库和头文件依赖的步骤:应用程序代码运行结果总结引言 本文继上篇的扩展Qt自身的插件,接着记录Qt自身的插件,只不过本文提及的用于扩展Qt自身的插件是可以在QtCreator的设…

在 Leetcode 上使用 Javascript 查找数组中的所有重复项(使用 JS 的 DSA)

在本篇博客文章中,我们将探讨如何在数组中找出所有重复的元素,这个问题源自LeetCode上的一个问题。 问题描述: 我们有一个包含n个整数的数组,所有整数都在范围[1, n]内。每个整数要么出现一次,要么出现两次。任务是找…

如何借助AI高效完成写作提纲

AI变革力量:未来数据中心的智能化之旅! 在当今这个信息爆炸的时代,人工智能(AI)在众多领域展现出了它的能力,特别是在写作领域。AI写作工具不仅能够帮助我们高效地生成内容,还能在一定程度上提升…

在vue和 js 、ts 数据中使用 vue-i18n,切换语言环境时,标签文本实时变化

我的项目需要显示两种语言(中文和英文),并且我想要切换语言时,页面语言环境会随之改变,但是目前发现,只能在vue中使用$t(‘’)的方式使用,但是这种方式只能在vue中使用,但是我的菜单文件是定义在js中&#…

JAVAEE之事务和事务传播机制

1.事务 1.1 事务的概念 事务是⼀组操作的集合, 是⼀个不可分割的操作. 事务会把所有的操作作为⼀个整体, ⼀起向数据库提交或者是撤销操作请求. 所以这组操作要么同时成功, 要么同时失败. 1.2 需要事务的原因 转账的时候,要么同时成功,要么同时失败…

关闭笔记本自带的键盘

目录 一、问题 二、方法 【方法一】 【方法二】 一、问题 笔记本自带的键盘上的个别按键又坏了,可能是因为使用电脑时,最先坏的几个按键那里温度比较高,久而久之就烧坏了吧。距离上次更换新键盘才差不多一年,所以不打算再买新…

2024年思维100春季线上比赛倒计时8天,来做做官方样题

今天是2024年4月12日,距离2024年春季思维100活动第一阶段的线上比赛4月20日还有8天。今年思维100活动的考试重点是什么呢?虽然主办方未公布,我们可以从主办方发布的参考题目中来推测今年的考试重点,并且按照这个来举一反三&#x…

任推邦七款热门拉新项目,普通人逆袭路径,月入6个W!

任推邦 不扣量的项目拉新平台 1UC网盘 —网推 价格上涨行业置顶 ,大厂项目 市场空白,预算充足,不限量 适合自媒体/抖快等渠道 上传下载不限速 2迅雷网盘—网推 官方核心服务商,大厂项目 群组内测(新增转播收…

TiDB 数据库调度(PD)揭秘

目录 一、PD 简介 1.1 元数据管理 1.2 调度决策 1.3 全局服务 1.4 集群配置与管理 二、TiKV 管理 2.1 调度需求 2.2 信息收集 三、TiDB server 管理 四、PD 集群主节点选取 一、PD 简介 TiDB PD (Placement Driver) 是 TiDB 分布式数据库系统中的核心组件之一,负…

应用实战|从头开始开发记账本2:基于模板快速开始

上期视频我们创建好了BaaS服务的后端应用。从这期视频开始,我们将从头开发一个互联网记账本应用。本期视频我们介绍一下如何使用模板快速开启我们的应用开发之旅。 应用实战|从头开始开发记账本2:基于模板快速开始 相关代码 本期视频我们介绍…