使用 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 测试场景。

相关推荐
lingran__3 分钟前
C++ STL unordered系列(哈希) 底层剖析与模拟实现万字详解 | 基于哈希表,复刻 SGI-STL 泛型哈希容器架构
开发语言·c++·后端·哈希算法·哈希表·泛型编程·unordered系列
小林ixn14 分钟前
NestJS 入门实战:从 0 到 1 撸一个 Todo CRUD,感受装饰器与模块化的优雅
后端·mvc·nestjs
阿弱20 分钟前
graph-core 的边与命令模式设计
java·后端·agent
智驭未来掌门人21 分钟前
利用Qt设计实现一款桌面程序
后端
长栎28 分钟前
你以为抽象工厂是「创建一组对象」——其实它是「锁定产品族兼容性」
后端
长栎30 分钟前
你的 AI 品控规则越来越多了——但它们已经在打架了,你没看见
后端
有脚就行33 分钟前
第24篇-Go-gRPC推理服务-高性能跨语言通信
开发语言·人工智能·后端·golang
不好听61336 分钟前
NestJS 是什么?一张图看懂企业级后端的骨架
后端·nestjs
liuxiaocheng38 分钟前
文本生成的进阶:generateText / streamText 里迟早会撞上的东西
前端·后端·ai编程
江小渔1 小时前
训练工程与训练平台入门33 追踪一次 TrainJob 的完整生命周期
后端