python:并发编程(二十七)

news2024/9/28 5:26:44

前言

本文将和大家一起探讨python并发编程的实际项目:Locust性能测试(篇一,共N篇),系列文章将会从零开始构建项目,并逐渐完善项目,最终将项目打造成适用于高并发场景的应用。

本文为python并发编程的第二十七篇,上一篇文章地址如下:

python:并发编程(二十六)_Lion King的博客-CSDN博客

下一篇文章地址如下:

(暂无)
 

一、Locust

1、Locust是什么

Python中的Locust是一个开源的性能测试工具和框架,用于模拟大量并发用户并评估Web应用程序或其他网络服务的性能。它是使用Python编程语言开发的,旨在提供简单而强大的性能测试解决方案。

使用Locust,您可以编写定义用户行为的脚本,然后以并发方式运行这些用户脚本。您可以指定每个用户在一段时间内执行特定的任务,例如访问特定的URL、提交表单或执行其他操作。Locust提供了一个用户友好的Web界面,可以监视和控制测试过程,包括并发用户数、请求成功率、响应时间等指标。

Locust还支持分布式性能测试,允许您将负载分散到多个物理或虚拟机器上,以模拟更大规模的用户访问。它还提供了丰富的统计数据和图表,帮助您分析和理解应用程序的性能特征。

使用Locust进行性能测试的一般步骤包括编写用户行为脚本、定义任务和负载模式、启动测试并监控结果,然后分析收集到的性能数据。

总而言之,Python中的Locust是一个功能强大且易于使用的性能测试工具,可帮助开发人员和测试人员评估Web应用程序的性能和承载能力。

2、Locust技术栈

Locust是基于多协程的。它使用协程(coroutines)来实现并发性能测试。在Locust中,每个模拟用户都被视为一个协程,并且可以同时执行多个协程,以模拟多个并发用户。

Locust使用Greenlet库来实现协程。Greenlet是一个用于Python的轻量级协程库,它允许在单个线程中实现并发执行。通过使用协程,Locust可以在一个进程中同时模拟大量的并发用户,而无需为每个用户创建一个线程或进程。

协程提供了一种轻量级的并发模型,因为它们不涉及线程或进程切换的开销。相比于传统的多线程或多进程模型,协程能够更高效地处理大量的并发用户,同时减少资源消耗。

通过利用协程,Locust可以实现高性能和高扩展性的性能测试。它能够模拟大量并发用户并生成高负载,同时保持较低的资源占用。这使得Locust成为一个强大而高效的性能测试工具。

二、协程真的有用么

1、进程、线程、协程特定场景并发对比

前面章节中,我们还没看到协程的能力,它真的有用么?现在,我们通过以下代码感受一下:

import asyncio
import multiprocessing
import threading
import time

# 多协程示例
async def coro_task(name):
    print(f"Start task: {name}")
    await asyncio.sleep(1)
    print(f"Complete task: {name}")

async def coro_main():
    tasks = []
    for i in range(50):
        tasks.append(coro_task(f"Task {i+1}"))

    await asyncio.gather(*tasks)

# 多进程示例
def proc_task(name):
    print(f"Start task: {name}")
    time.sleep(1)
    print(f"Complete task: {name}")

def proc_main():
    processes = []
    for i in range(50):
        p = multiprocessing.Process(target=proc_task, args=(f"Task {i+1}",))
        processes.append(p)
        p.start()

    for p in processes:
        p.join()

# 多线程示例
def thread_task(name):
    print(f"Start task: {name}")
    time.sleep(1)
    print(f"Complete task: {name}")

def thread_main():
    threads = []
    for i in range(50):
        t = threading.Thread(target=thread_task, args=(f"Task {i+1}",))
        threads.append(t)
        t.start()

    for t in threads:
        t.join()

# 计算耗时
if __name__ == "__main__":
    a = time.time()
    # 多协程示例
    asyncio.run(coro_main())
    b = time.time()
    # 多进程示例
    proc_main()
    c = time.time()
    # 多线程示例
    thread_main()
    d = time.time()
    print("协程:", b-a)
    print("进程:", c-b)
    print("线程:", d-c)

以上代码展示了多协程、多进程和多线程示例,并计算它们的耗时。代码中的分析部分对每个示例的耗时进行了比较。

在分析部分的代码中,首先记录了开始时间(变量a),然后运行多协程示例,再记录结束时间(变量b)。接下来运行多进程示例,记录结束时间(变量c),最后运行多线程示例并记录结束时间(变量d)。

然后,通过计算变量b-a、c-b和d-c的差值,得到了每个示例的耗时。最后,使用print语句打印出了每个示例的耗时结果。

这段代码的目的是对比多协程、多进程和多线程在执行50个任务时的耗时情况。通过打印出的结果,你可以观察到每种并发模型的耗时差异。

请注意,具体的耗时结果可能会因系统和硬件的不同而有所差异。此外,需要注意的是,多协程模型由于其轻量且高效的特性,可能在处理大量IO密集型任务时表现更好,而多进程和多线程模型可能在处理CPU密集型任务或需要利用多核处理器的场景中更加适用。因此,在选择并发模型时,需要综合考虑应用程序的特性和需求。

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

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

相关文章

分支定价算法求解VRPTW问题(代码非原创)

参考文献:微信公众号“程序猿声”关于分支定价求解VRPTW的代码 A tutorial on column generation and branch-and-price for vehicle routing problems 框架 对于VRPTW问题,先做线性松弛,调用列生成算法(一种解决大型线性规划问…

Docker网络之Network Namespace

Docker网络中相关的命令非常少,但需要掌握的底层原理却又非常多。 1.Network Namespace Docker网络底层原理是Linux的Network Namespace,所以说对于Linux Network Namespace的理解对Docker网络底层原理的理解就显得尤为重要了。 2.需求 通过手工的方式…

ICC2与INNOVUS命令对照表

ICC2与INNOVUS命令对照表 TargetICC2INNOVUS设置多CPU set_host_options -max_cores16 setMultiCpuUsage -localCpu 16 获得物体的属性 get_attribute

DSP,国产C2000横空出世,QX320F280049,替代TI 的 TMS320F280049,支持国产

一、特性参数 1、独立双核,32位CPU,单核主频400MHz 2、IEEE 754 单精度浮点单元 (FPU) 3、三角函数单元 (TMU) 4、1MB 的 FLASH (ECC保护) 5、1MB 的 SRAM (ECC保护&…

全网最全,Selenium自动化测试POM模式总结(详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 在UI自动化测试中…

Python+Selenium+Unittest 之selenium7--元素定位6-CSS定位1(定位所有、定位class、定位id、tag定位)

目录 一、CSS简介 二、 定位方式 三、实践操作 1、*(定位所有元素) 2、. (定位class属性) 3、#(定位id属性) 4、tag定位 一、CSS简介 CSS属于是一种计算机语言,主要是用来为结构化文档的外…

软件测试期末速成(背题家出列!)

文章目录 一、前言二、选择题(15 X 2)1、概述2、相关概念3、黑盒测试4、白盒测试5、单元测试6、集成测试7、系统测试8、自动化测试9、实用软件测试技术 三、判断题(10 X 1’)四、简答题(4 X 5)1、软件测试生…

一文学会Nginx做图片服务器

Nginx做图片服务器 前言: Nginx是一个高性能的HTTP和反向代理web服务器,以及负载均衡器。根据nginx是高性能的http服务器,因此可以用作图片服务器使用。 本案例是在docker安装nginx来操作的。 什么是Nginx? Nginx是一款高性能的Web服务器和反向代理服…

linux入门之浅谈shell及权限的概念

文章目录 目录 文章目录 一、shell命令以及运行原理 二、linux权限的概念 1.Linux权限管理 a.文件访问者的分类(人) b.文件类型和访问权限 1)文件类型 2)基本权限 3)文件权限值的表示方法 4)文件访问权限的相…

docker快速部署oracle19c、oracle12c,测试环境问题复现demo快速搭建笔记

Oracle 19c测试环境快速搭建 安装 # 下载镜像 19.3.0.0.0 docker pull registry.cn-hangzhou.aliyuncs.com/laowu/oracle:19c # 创建文件 mkdir -p /mymount/oracle19c/oradata # 授权,不授权会导致后面安装失败 chmod 777 /mymount/oracle19c/oradatadocker run …

01背包思路解析+代码

01背包 题目链接:01背包 思路:题目要求是获取背包能装的最大重量。一个物品有体积和重量两个属性。而当我们判断一个物品是否要放进背包,第一取决于他的体积是否足以放进背包,第二取决于他的重量是否足以让我们取出已经放入的一部…

buuctf 你有没有好好看网课? 解析

打开文件得到两个压缩包,第一个压缩包flag2需要密码,第二个压缩包flag3打开后在备注可以获得提示 使用arc爆破,得到6位数字密码 解压压缩包得到一个视频和文档 文档内容包含6个数字,结合视频猜测是关键信息藏在这两个时间节点上 …

XSS注入——DOM型XSS

DOM型xss XSS根据恶意脚本的传递方式可以分为3种,分别为反射型、存储型、DOM型,前面两种恶意脚本都会经过服务器端然后返回给客户端,相对DOM型来说比较好检测与防御,而DOM型不用将恶意脚本传输到服务器在返回客户端,这…

如何优化Nginx服务进程(详细教程)

目录 一、了解Nginx服务配置内容 ① 外框架 ② 内框架 ③ 三个主模块 二、Nginx服务进程 访问信息的组成 Web服务的监听配置 LNMP架构 三、Nginx优化 隐藏版本号 可以查询指定地址的服务信息 更改配置文件内容 检查语法错误 重启服务 再次查看版本号是否隐藏 自…

【qiankun】前端微服务踩坑记录-长期更新

目录 前言 1.Cannot GET /cooperation/board 场景: 分析 解决 2.Invalid options in vue.config.js:"css.requireModuleExtension" is not allowed 原因 解决 3.less版本升级导致除法写法未转换 原因 解决 4.主子应用样式隔离 场景 解决 5…

Java进阶必读书单及博客

java基础 Java核心技术 卷I:开发基础(原书第12版) Java核心技术 卷II:高级特性(原书第12版) JVM 《深入理解Java虚拟机(第3版)》 并发 《Java并发编程实战》 《Java并发编程的艺术》 数据库 《MySQL技术…

win下安装Nginx

安装Nginx 前言 本文演示win11下安装Nginx-1.24.0。本文旨在记录安装流程以及梳理安装配置过程中的一些容易出错的地方。 目录 文章目录 前言目录下载Nginx安装包配置环境变量配置Nginx设置报错日志路径设置Nginx的启动端口号 启动Nginx 下载Nginx安装包 前往Nginx官方下载…

FineReport学习1

聚合报表是指将多个子报表数据进行集中汇总、分析和呈现的报表,通常用于展示公司的整体数据情况。聚合报表可以帮助管理人员和决策者更全面、准确地了解公司在不同维度上的业务情况,便于对公司业务进行分析和决策。 决策报表则是指根据决策需求构建的针…

性能测试——银行核心业务系统性能测试

目录 前言: 测试内容 测试方法 注意事项 总结: 前言: 本文讨论的是基于字符终端型的银行核心业务系统。银行核心业务系统由于其复杂的业务流程,以及特殊的终端字符形式,与一般的B/S结构、C/S结构系统有较大的差异&am…

Vue3新特性全预览

目录 自定义Hook函数 介绍 示例 toRef和toRefs 介绍 代码示例 shallowReactive和shallowRef(不常用只做了解) readonly与shallowReadonly(不常用只做了解) toRaw与markRaw(不太常用只做了解) provide与inject 介绍 代码示例 ​编辑 响应式数据的判断 Composition Api的…