百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

并发模拟的四种方式+工具,超级实用

ahcoder 2025-06-24 11:11 2 浏览

原文链接:
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不是线程安全的,且没有作防护措施,结果是错的



相关推荐

卡巴斯基实验室成功将Linux系统的驱动程序移植到“KasperskyOS”

据os.kaspersky.com网站8月8日报道,俄罗斯卡巴斯基实验室启动了一个研究项目,将Linux驱动程序移植到卡巴斯基公司自主研发的操作系统KasperskyOS——这是该实验室创建的“安全...

服务器程序从 Windows 系统移植到 Linux/x86_64 平台时总是崩溃?

清华大学出版社的《高效C/C++调试》一书给出了回答:我们的服务器程序最初是为Windows系统开发的,第一次将它移植到Linux/x86_64平台时,它在回归测试中十次会崩溃八次,且仅在...

Linux系统的移植和裁剪(linux移植lvgl)

本节将嵌入式Linux系统按需求裁剪后移植到ARM处理器中。通过对Linux系统的了解和认识,我们在这里选择Linux4.1.15版本,该版本支持64位处理器,相对于前面几代Linux版本有了更大的提...

搭建RISC-V模拟环境(搭建虚拟环境)

现在RISC-V在主流操作系统上基本都能模拟了,不过我还是觉得Linux下好用。之前在Mac上想用Linux,基本就是在VirtualBox上创建一个虚拟机,从网上下一个Ubuntu的安装iso,安...

CPU虚拟化:陷入和模拟(cpu虚拟模式是什么)

导读:本文摘自于王柏生、谢广军撰写的《深度探索Linux系统虚拟化:原理与实现》一书,重点讨论了虚拟CPU在Guest模式下运行时,由于运行敏感指令而触发虚拟机退出的典型情况。作者:王柏生、谢广军来源...

《模拟山羊》恶搞僵尸主题DLC公布 《DayZ》躺枪!

近日,开发商CoffeeStain为我们带来了一个好消息,那就是奇葩游戏《模拟山羊(GoatSIMulator)》僵尸主题DLC“GoatZ”将于5月7日登陆PC,Mac,Linux,iOS和安卓...

「精品课程」模拟IC设计进阶(模拟ic设计师怎么样)

课程导语模拟集成电路设计最重要的是基础理论知识,基础理论的重要性很多人一开始并没有意识到,工作一段时间,做过几个项目以后就会深有感触。除此之外就是个人的学习能力和分析问题、解决问题的能力,其实这些能力...

跨平台神器:在Linux上轻松运行Windows软件的方法大揭秘!

Wine始于30年前的一个业余爱好项目,当时Windows3.1及其16位API出现了。在一个简单的“HelloWorld”程序之后,它很快就成功地让Solitaire运行起来。...

LAMMPS 模拟教程全新发布,助力科研入门分子模拟世界

https://arxiv.org/html/2503.14020v1本研究发布了8个层层递进的LAMMPS模拟教学教程,并配套开发了专属图形界面LAMMPS–GUI,显著降低了分子模拟的入门门槛。...

Linux趣味命令,每一个都能产生炫酷效果(示例)

Linux趣味命令,每一个都能产生炫酷的效果:cmatrix:模拟《黑客帝国》中的字符矩阵效果。bashCopycodecmatrixfortune:随机显示一句有趣的引语或笑话。bashCopy...

「免费!免费!Chris老师经典模拟课程」CMOS模拟电路设计流程

创芯大讲堂为广大学员发福利各位创芯大讲堂的同学们,即日起,凡当月购买大讲堂课程达到300元的同学可以享受创芯大讲堂全场课程8折优惠,凡当月购买创芯大讲堂课程达到500元的同学可以享受创芯大讲堂全场课程...

Gromacs基本模拟流程(gromacs运行命令)

GROMACS是一个使用经典分子动力学理论研究蛋白质动力学的高端的高效的工具。GROMACS是遵守GNU许可的免费软件,可以从以下站点下载:http://www.gromacs.org,并且可以在l...

国外友人开创Python模拟登陆神库,完美修改它为咱们所用

Awesome-python-login-model是一个国人开发的模拟登陆仓库,在这个仓库上有20几个网站的模拟登陆脚本,你可以基于这个仓库实现的代码做简易的修改,以实现自己的自动化功能。仓库地址...

并发模拟的四种方式+工具,超级实用

原文链接:https://mp.weixin.qq.com/s/jJDJ8YwmzkKS9KvfMamLWA一、PostmanPostman是一个款http请求模拟工具首先演示一下postman最基本...

精选模拟IC设计仿真课程(精选模拟ic设计仿真课程怎么样)

课程介绍本系列课程采用屏幕录制视频及操作解说的形式,注重于模拟芯片设计流程中的电路原理图设计、仿真及优化方法、版图设计、寄生参数提取及后仿真优化等的实际操作,在电路设计过程中学习模拟IC设计和验证方法...