并发模拟的四种方式+工具,超级实用
liuian 2025-01-04 21:27 48 浏览
原文链接:https://mp.weixin.qq.com/s/jJDJ8YwmzkKS9KvfMamLWA
一、Postman
Postman是一个款http请求模拟工具
首先演示一下postman最基本的使用
创建一个Springboot项目,测试的代码如下:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("test")
public class TestConrtoller {
@GetMapping("demo")
public String testDemo() {
return "result~";
}
}
为了便于操作,一般会将
http://127.0.0.1:8080 是经常使用的地址+端口号,可以设置为环境
点击右上角的设置图标
选择global
输入信息
以后再进行测试就能这样搞简写了
知道基本使用之后,我们来看一下如何模拟并发测试
填写基本信息后,创建
这个时候会创建出Concurrency的文件夹,我们可以把刚才测试的demo的例子放进这个文件夹下
这个时候就可以在Concurrency下看到这个接口测试了
选择并发测试:
这个时候弹出我们想要的框了
点击Run Concurrency
你可以立马感觉到CPU在“燃烧”,因为要记录并打印日志,显示的话是一条一条来的,其实测试的速度,要比你看到的打印的日志的速度快,绿色表示正常
二、Apache Bench(AB)
ApacheBench 是 Apache 服务器自带的一个web压力测试工具,简称ab。
ab又是一个命令行工具,对发起负载的本机要求很低,根据ab命令可以创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问,因此可以用来测试目标服务器的负载压力。总的来说ab工具小巧简单,上手学习较快,可以提供需要的基本性能指标,但是没有图形化结果,不能监控。
使用的话,首先需要安装Apache服务器
网站:传送门 http://httpd.apache.org/download.cgi
因为我的操作系统是windows10, 这里选择File for Microsoft Windows
Linux下的安装是非常简单的,这里不再演示
选择 ApacheHaus
进入下载页面 选择适合自己电脑的版本
文件解压到本地文件夹下,如果不是解压在c盘,需要设置参数,注意文件路径最好都是英文
关于需要设置参数,conf->httpd.conf 使用文本编辑器打开,
需要修改的有三个地方:
运行根目录,修改成自己解压到本地的路径
监听端口,默认监听端口是80,如果已被使用会报错需要修改,如果80端口未被使用,可不修改;如果修改了监听端口,则需要把ServerName localhost也相应改成同样的端 口号
DocumentRoot 测试文件存放地,且该目录必须存在
配置完成后,命令行cmd进入D:\softUtil\Apache24\bin目录下
httpd.exe -k install
启动:
httpd.exe -k start
测试:
- -n :请求数
- -c: 并发数
三、并发模拟工具JMeter
JMeter也是一款性能测试工具,是图形化的。
下载地址:传送门 http://jmeter.apache.org/
需要Java8+的环境
解压到你觉得合适的目录下(注意最好是英文路径)
进入它的bin目录下 启动jmeter.bat即可
使用很简单,首先在测试计划部分新建一个线程组
设置好基础信息后添加HTTP请求(基本信息设置好没有OK哈,直接添加HTTP请求)
填写HTTP请求相关的内容
之后还要添加监听器,这里选择的是图形结果
再添加一个查看结果的树吧
在运行之前打开log Viewer
下面开始运行:
执行成功,来感受一下结果:
点进去
查看结果树
四、代码模拟
这里需要用到一个类,就是CountDownLatch。
CountDownLatch是一个计数器闭锁,通过它可以完成类似于阻塞当前线程的功能,即:一个线程或多个线程一直等待,直到其他线程执行的操作完成。
CountDownLatch用一个给定的计数器来初始化,该计数器的操作是原子操作,即同时只能有一个线程去操作该计数器。调用该类await方法的线程会一直处于阻塞状态,直到其他线程调用countDown方法使当前计数器的值变为零,每次调用countDown计数器的值减1。当计数器值减至零时,所有因调用await()方法而处于等待状态的线程就会继续往下执行。这种现象只会出现一次,因为计数器不能被重置。
下图和它的方法可以体现出来:
CountDownLatch类只提供了一个构造器:
public CountDownLatch(int count) { }; //参数count为计数值
然后下面这3个方法是CountDownLatch类中最重要的方法(上图能够反映出来)
public void await() throws InterruptedException { }; //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { }; //和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
public void countDown() { }; //将count值减1
下面还需要看一个类Semaphore
Semaphore与CountDownLatch相似,不同的地方在于Semaphore的值被获取到后是可以释放的,并不像CountDownLatch那样一直减到底。
它也被更多地用来限制流量,类似阀门的 功能。如果限定某些资源最多有N个线程可以访问,那么超过N个主不允许再有线程来访问,同时当现有线程结束后,就会释放,然后允许新的线程进来。有点类似于锁的lock与 unlock过程。相对来说他也有两个主要的方法:
- 用于获取权限的acquire(),其底层实现与CountDownLatch.countdown()类似;
- 用于释放权限的release(),其底层实现与acquire()是一个互逆的过程。
通过这两个类型可以进行并发的模拟:
测试一下:
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.*;
@Slf4j
public class CuncurrencyTest {
// 请求总数
public static int clientTotal = 5000;
// 同时并发执行的线程总数
public static int threadTotal = 200;
public static int count = 0;
public static void main(String[] args) throws InterruptedException {
// 定义线程池
ExecutorService executorService = Executors.newCachedThreadPool();
// 定义信号量 最大的线程数量
final Semaphore semaphore = new Semaphore(threadTotal);
final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
for (int i = 0; i < clientTotal; i++) {
executorService.execute(() -> {
try {
semaphore.acquire();
add();
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
log.error("exception",e);
}
countDownLatch.countDown();
});
}
countDownLatch.await();
executorService.shutdown();
log.info("count:{}",count);
}
private static void add() {
count++;
}
}
因为count不是线程安全的,且没有作防护措施,结果是错的
相关推荐
- 电脑运行速度慢怎么办(电脑运行速度慢咋办)
-
清理电脑桌面电脑桌面上的东西越少越好,东西多了占系统资源。虽然在桌面上方便些,但是要付出占用系统资源和牺牲速度的代价。解决办法:①将桌面上快捷方式都删了,因为这些在“开始”菜单和“程序”栏里都有。②将...
- foxmail和qq邮箱的关系(foxmail邮箱和outlook)
-
是的,QQ邮箱和Foxmail邮箱是一个团队开发的就是原来的Foxmail客户端开发团队不过被腾讯收购了所以,我们看的的QQ邮箱和Foxmail邮箱是一样的。只是Foxmail功能少的点,而切也不够出...
- 电脑如何创建虚拟光驱(如何建立虚拟光驱)
-
虚拟光驱是一种软件,可以模拟实体光盘,使得用户可以在没有实体光盘的情况下使用光盘的功能,如安装应用程序、游戏等。下面是安装虚拟光驱的一般步骤:1.选择一个虚拟光驱软件,比如VirtualClone...
- 360怎么修复u盘(用360怎么修复u盘)
-
如果是有盘符而没有显示出来的:右击我的电脑/管理/存储/磁盘管理,然后右击“可移动磁盘”图标”单击快捷菜单中的“更改驱动器和路径”选项,并在随后的界面中单击“添加”按钮,接下来选中“指派驱动器号”,同...
- cad2025永久激活密钥(cad2016激活密钥)
-
CAD2021的序列号和密钥激活步骤如下:1.首先,确保您已经购买了CAD2021的许可证。您可以在Autodesk官网上购买或联系您的Autodesk代理购买。2.下载并安装CAD2021软件。...
- window7下载lr2019(window7下载一键重装如何恢复网络)
-
手机上要下载软件的话就到手机上应用商店里面去下载是最安全的
-
- 在线装机软件哪个好(线上装机软件)
-
极客狗装机大师、极速系统装机大师都不错。1、极客狗装机大师采用了精美简洁的UI设计界面,让小白用户也可以轻松上手操作,可一键重装xp/win7/win8/win10操作系统,非常方便,有了它不用再担心自己不会重装系统啦,同时软件还提供了备份...
-
2026-01-08 23:05 liuian
- wifi防蹭网神器手机版下载(wifi防蹭网软件哪个好用)
-
以目前的路由器品牌来说,解决这个问题是非常简单的,根本不需要使用第三方的APP客户端,几乎所有的品牌都有自己的APP客户端1、360路由器360路由器直接在手机应用市场下载“360家庭防火墙”APP...
- 为什么硬盘插到电脑没有显示
-
1、驱动程序的问题。 硬盘不显示和驱动程序有很大关系,如果程序不匹配或者是有问题,硬盘无法被正常读取,需要先卸载掉之前的驱动,并重新安装新的驱动一般就能恢复。2、USB设...
- 电脑显卡天梯图2025(笔记本电脑显卡天梯图2025)
-
2024年奥运会排名预测,第一名美国,第二名中国。结合21年东京奥运会成绩和今年各奥运项目比赛成绩,美国在田径游泳金牌大项目是收获大量奖牌,中国会在跳水,乒乓球,羽毛球等强行收获满满,预测第一美国,第...
- 固态硬盘的作用是什么(固态硬盘有什么功能)
-
固态硬盘作用 固态硬盘最大的作用就是快防震抗摔性:传统硬盘都是磁碟型的,数据储存在磁碟扇区里。而固态硬盘是使用闪存颗粒(即mp3、U盘等存储介质)制固态硬盘作而成,所以SSD固态硬盘内部不存在任何机械...
- 笔记本电脑蓝屏进不去系统怎么办
-
当笔记本电脑开机出现蓝屏时,可以尝试以下步骤来恢复系统:1.重启电脑:按住电源按钮长按几秒钟,让电脑完全关机,然后再按下电源按钮重新启动电脑。有时候蓝屏问题可能只是暂时的,重启电脑后可能会解决问题。...
- windows7开机无法启动怎么办
-
电脑windows7无法启动解决方法如下1、进不了系统,首先关闭电源,开机之后立刻按F8键,进入系统模式选择界面;2、在这里有几种模式需要大家注意,安全模式、最后一次正确配置和正常启动模式,当然其他模...
- 无线路由器登录入口官网(lte无线路由器登录入口)
-
路由器最为常用的登录地址是192.168.1.1,有很多的网友把192.168.1.1称之为路由器登录官网跟路由器官网登录入口,这个叫法并不准确;因为不同品牌型号的路由器,它的登录地址可能是不一样的。...
- 一周热门
-
-
飞牛OS入门安装遇到问题,如何解决?
-
如何在 iPhone 和 Android 上恢复已删除的抖音消息
-
Boost高性能并发无锁队列指南:boost::lockfree::queue
-
大模型手册: 保姆级用CherryStudio知识库
-
用什么工具在Win中查看8G大的log文件?
-
如何在 Windows 10 或 11 上通过命令行安装 Node.js 和 NPM
-
威联通NAS安装阿里云盘WebDAV服务并添加到Infuse
-
Trae IDE 如何与 GitHub 无缝对接?
-
idea插件之maven search(工欲善其事,必先利其器)
-
如何修改图片拍摄日期?快速修改图片拍摄日期的6种方法
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
