Linux并发请求核心是控制并发数、避免资源耗尽及处理超时错误;可用curl+xargs(简单批量)、Python多线程/asyncio(灵活定制)或Go/Rust(高性能长期运行),并需调优ulimit、somaxconn等系统参数。

Linux 下并发发送请求,核心是利用多进程、多线程或异步 I/O 机制,绕过单请求串行等待的瓶颈。关键不在于“怎么发”,而在于“怎么管”——控制并发数、避免资源耗尽、处理超时和错误。
用 curl + xargs 并发调用(简单脚本场景)
适合批量 HTTP 请求,如健康检查、批量通知。xargs 的 -P 参数可指定最大并行数,防止打爆目标或本地端口:
seq 1 100 | xargs -P 10 -I {} curl -s -o /dev/null -w "%{http_code}\n" "https://api.example.com/test?i={}"- -P 10 表示最多同时跑 10 个 curl 进程
- -I {} 把每个数字代入 URL,实现参数化
- 加 -s 静默输出,用 -w 提取状态码,便于后续统计
用 Python 的 requests + threading 或 asyncio(灵活可控)
需要定制逻辑(如带 Token、重试、结果聚合)时更合适。同步多线程简单直接;异步(asyncio + aiohttp)吞吐更高,尤其 I/O 密集型:
# threading 示例(限制 20 线程) from concurrent.futures import ThreadPoolExecutor import requestsdef fetch(url): return requests.get(url, timeout=5).status_code
urls = [f"https://www.php.cn/link/2bb054c14409adcb28cb8d922e10a383}" for i in range(100)] with ThreadPoolExecutor(max_workers=20) as ex: results = list(ex.map(fetch, urls))
- 线程数不宜超过 50,太多反而因 GIL 和上下文切换拖慢
- 异步方案推荐 aiohttp,单进程轻松支撑数百并发连接
- 务必设 timeout,否则一个卡住的请求会拖垮整个池
用 Go 或 Rust 写轻量客户端(高性能/长期运行)
如果并发量大(如每秒上千请求)、要求低延迟或需嵌入其他服务,用 Go 更省心:
go func() {
for _, u := range urls {
go func(url string) {
resp, _ := http.Get(url)
defer resp.Body.Close()
// 处理 resp...
}(u)
}
}()- Go 的 goroutine 开销极小,轻松启动上万并发 HTTP 客户端
- 配合 semaphore 控制并发上限,避免文件描述符耗尽
- Rust 用 tokio + reqwest 同样高效,内存更安全
注意系统级限制(常被忽略)
并发不是设个数字就完事。Linux 默认限制可能让你的“100 并发”实际只有 10 个在跑:
- 检查并调大:ulimit -n(文件描述符数),HTTP 并发连接数直接受限于此
- 临时提升:ulimit -n 65536(当前 shell 有效)
- 确认 /proc/sys/net/core/somaxconn 和 net.ipv4.ip_local_port_range 足够宽
- 用 ss -s 或 netstat -an | grep :80 | wc -l 观察真实连接数
基本上就这些。选哪种方式,取决于你手头的工具链、QPS 需求和维护成本偏好。脚本任务用 xargs,胶水逻辑用 Python,长期高负载用 Go/Rust,再配上合理的系统调优——并发请求就稳了。










