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