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

相关推荐
BingoGo3 小时前
PHP 开发者应该理解的 Linux 入门权限指南
后端·php
堇未央3 小时前
求助,无法获取到最新的数据
后端
福大大架构师每日一题3 小时前
2025-10-11:求出数组的 X 值Ⅰ。用go语言,给定一个只包含正整数的数组 nums 和一个正整数 k。 你可以进行一次删除操作:在数组两端各自选取一段
后端
Arva .3 小时前
电子书查询列表接口开发
后端
间彧3 小时前
在Spring Cloud Gateway中,如何自定义GlobalFilter实现动态路由规则?
后端
间彧3 小时前
在微服务架构中,过滤器与网关(如Spring Cloud Gateway)如何配合使用?
后端
间彧4 小时前
SpringBoot过滤器详解与项目实战
后端
武子康4 小时前
大数据-121 - Flink 时间语义详解:EventTime、ProcessingTime、IngestionTime 与 Watermark机制全解析
大数据·后端·flink
两万五千个小时4 小时前
LangChain 入门教程:构建你的第一个聊天机器人
后端