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

相关推荐
金銀銅鐵3 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
念何架构之路4 小时前
go-grpc设计思想
开发语言·后端·golang
system_error_x4 小时前
SpringBoot 集成 Thymeleaf 简洁入门
java·spring boot·后端
步行cgn6 小时前
Spring MVC 视图机制的核心接口与类
java·开发语言·后端·spring·mvc
码事漫谈7 小时前
AI 读你的提示词,其实很没耐心
后端
用户8356290780517 小时前
如何使用 Python 格式化 Excel 单元格中的长文本
后端·python
我命由我123457 小时前
Python 开发 - Python 的 pathlib
java·开发语言·后端·python·学习·java-ee·学习方法
IT_陈寒7 小时前
Java性能优化完全指南
前端·人工智能·后端
电子IT笔记7 小时前
对接群晖NAS,上传和删除踩坑记录
前端·后端
Mk598788 小时前
P4:把 Agent 的记忆搬进 Redis —— AgentScope-Java 工程化实战
后端