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

相关推荐
毕设源码-郭学长14 分钟前
【开题答辩全过程】以 基于SpringBoot框架的民俗文化交流与交易平台的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
l***217828 分钟前
SpringBoot Maven快速上手
spring boot·后端·maven
f***14771 小时前
SpringBoot实战:高效实现API限流策略
java·spring boot·后端
计算机毕设VX:Fegn08951 小时前
计算机毕业设计|基于springboot + vue动物园管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
BD_Marathon2 小时前
SpringBoot——多环境开发配置
java·spring boot·后端
实战项目2 小时前
ASP.NET实现的房产中介管理系统设计
后端·asp.net
Victor3562 小时前
Hibernate(38)如何在Hibernate中配置乐观锁?
后端
Victor3562 小时前
Hibernate(37)Hibernate的多表联合查询如何实现?
后端
摸鱼的春哥3 小时前
AI编排实战:用 n8n + DeepSeek + Groq 打造全自动视频洗稿流水线
前端·javascript·后端