使用 curl 进行并发请求的指南:7种方法详解

使用 curl 进行并发请求的指南:7种方法详解

背景

API 测试中,经常需要同时发起多个 HTTP 请求来测试接口性能、验证系统负载能力或进行压力测试。curl 作为最强大的命令行 HTTP 工具,在某些场景下我们可以使用 curl 来完成一些简单的并发请求。

本文将详细介绍 7 种不同的 curl 并发请求方法。

1. 使用 &后台运行(最简单直接)

bash 复制代码
# 同时发起多个请求
curl https://www.baidu.com/endpoint1 &
curl https://www.baidu.com/endpoint2 &
curl https://www.baidu.com/endpoint3 &
wait  # 等待所有后台任务完成

适用场景:快速测试少量接口,简单易用,无需额外工具。

2. 使用 xargs 进行并行控制

bash 复制代码
# 从文件读取URL列表并并发请求
echo -e "https://www.baidu.com/endpoint1\nhttps://www.baidu.com/endpoint2\nhttps://www.baidu.com/endpoint3" | xargs -n 1 -P 10 curl -s

# 参数说明:
# -n 1: 每次传递1个参数
# -P 10: 最多并行运行10个进程
# -s: curl静默模式

优势:可以精确控制并发数量,适合中等规模的并发测试。

3. 使用 GNU parallel 专业并行工具

csharp 复制代码
# 安装 parallel (Ubuntu/Debian)
sudo apt-get install parallel

# 并发执行
parallel -j 10 curl -s {} ::: \
  https://www.baidu.com/endpoint1 \
  https://www.baidu.com/endpoint2 \
  https://www.baidu.com/endpoint3

# 从文件读取URL
parallel -j 10 curl -s {} :::: urls.txt

特点:功能强大,支持复杂的并行任务调度,适合专业性能测试。

4. Bash 循环 + 后台任务管理

bash 复制代码
#!/bin/bash

urls=(
  "https://www.baidu.com/endpoint1"
  "https://www.baidu.com/endpoint2" 
  "https://www.baidu.com/endpoint3"
  "https://www.baidu.com/endpoint4"
)

# 并发发起请求
for url in "${urls[@]}"; do
  {
    echo "开始请求: $url"
    response=$(curl -s -w "%{http_code}" "$url")
    echo "完成请求: $url, 状态码: $response"
  } &
done

wait  # 等待所有任务完成
echo "所有请求已完成"

优势:灵活性强,可以自定义请求逻辑和结果处理。

5. 压力测试专用方案

bash 复制代码
# 对同一个接口发起100个并发请求
seq 1 100 | xargs -n1 -P10 -I{} curl -s "https://www.baidu.com/test"

# 带重试和超时的并发请求
parallel -j 20 --timeout 30 --retries 3 curl -s --max-time 10 {} ::: \
  https://www.baidu.com/endpoint1 \
  https://www.baidu.com/endpoint2

适用场景:系统压力测试、负载能力验证。

6. 高级并发控制脚本

bash 复制代码
#!/bin/bash

MAX_CONCURRENT=5
TIMEOUT=30

make_request() {
    local url=$1
    local id=$2
    
    echo "[$$] 开始请求 $id: $url"
    
    response=$(curl -s \
        --max-time $TIMEOUT \
        --write-out "HTTPSTATUS:%{http_code};TIME:%{time_total}" \
        "$url")
    
    http_status=$(echo $response | grep -o "HTTPSTATUS:[0-9]*" | cut -d: -f2)
    time_total=$(echo $response | grep -o "TIME:[0-9.]*" | cut -d: -f2)
    
    echo "[$$] 完成请求 $id: HTTP $http_status, 用时 ${time_total}s"
}

export -f make_request
export TIMEOUT

# 并发执行
printf "链接\nhttps://httpbin.org/delay/2\nhttps://httpbin.org/delay/3\n" | \
    parallel -j $MAX_CONCURRENT make_request {} {#}

特点:完整的请求监控、超时控制和结果分析,适合生产环境使用。

7. 使用 curl 的连接复用优化

lua 复制代码
# 对同一主机的多个请求使用连接复用
curl -s \
  --http2 \
  --connect-timeout 5 \
  --max-time 30 \
  "https://www.baidu.com/endpoint1" \
  "https://www.baidu.com/endpoint2" \
  "https://www.baidu.com/endpoint3"

优势:减少 TCP 握手开销,提升请求效率,特别适合同一主机的多个请求。

方法选择指南

根据你的具体需求选择合适的方案:

  • 快速测试 :使用 &后台运行
  • 中等并发:选择 xargs 控制并发数
  • 专业测试:使用 GNU parallel 获得完整功能
  • 生产环境:编写完整的控制脚本
  • 性能优化:启用连接复用和 HTTP/2

结语

掌握这些 curl 并发请求技巧,就能简单应对一些 HTTP 测试场景。

相关推荐
橙露7 分钟前
SpringBoot 全局异常处理:优雅封装统一返回格式
java·spring boot·后端
LiveWillChange22 分钟前
第一阶段:基本功能实现
后端
朝阳58129 分钟前
rust 交叉编译指南
开发语言·后端·rust
用户8356290780511 小时前
使用 Python 合并与拆分 Excel 单元格的实用方法
后端·python
thinkingandcoding1 小时前
BTrace实战:Arthas搞不定的那些场景
后端
王码码20351 小时前
Go语言中的配置管理:从Viper到环境变量
后端·golang·go·接口
Bug终结者_2 小时前
别只会写 Java 了!LangChain4J 带你弯道超车 AI 赛道
后端·langchain·ai编程
Oneslide2 小时前
MySQL性能排查实战:大量Sleep空闲连接导致数据库写入缓慢解决方案
后端
码界奇点2 小时前
基于Spring Boot的前后端分离商城系统设计与实现
java·spring boot·后端·java-ee·毕业设计·源代码管理
fox_lht3 小时前
7.3.结构体-方法
开发语言·后端·rust