首页 > 运维 > linux运维 > 正文

Linux 并发发送请求怎么实现?

舞姬之光
发布: 2025-12-05 15:55:00
原创
472人浏览过
Linux并发请求核心是控制并发数、避免资源耗尽及处理超时错误;可用curl+xargs(简单批量)、Python多线程/asyncio(灵活定制)或Go/Rust(高性能长期运行),并需调优ulimit、somaxconn等系统参数。

linux 并发发送请求怎么实现?

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 requests
<p>def fetch(url): return requests.get(url, timeout=5).status_code</p>
                    <div class="aritcle_card">
                        <a class="aritcle_card_img" href="/xiazai/gongju/1570">
                            <img src="https://img.php.cn/upload/manual/000/000/017/169233859552299.png" alt="TeemIp - IPAM and DDI solution">
                        </a>
                        <div class="aritcle_card_info">
                            <a href="/xiazai/gongju/1570">TeemIp - IPAM and DDI solution</a>
                            <p>TeemIp是一个免费、开源、基于WEB的IP地址管理(IPAM)工具,提供全面的IP管理功能。它允许您管理IPv4、IPv6和DNS空间:跟踪用户请求,发现和分配IP,管理您的IP计划、子网空间、区域和DNS记录,符合最佳的DDI实践。同时,TeemIp的配置管理数据库(CMDB)允许您管理您的IT库存并将您的配置项(CIs)与它们使用的IP关联起来。项目源代码位于https://github.com/TeemIP</p>
                            <div class="">
                                <img src="/static/images/card_xiazai.png" alt="TeemIp - IPAM and DDI solution">
                                <span>10</span>
                            </div>
                        </div>
                        <a href="/xiazai/gongju/1570" class="aritcle_card_btn">
                            <span>查看详情</span>
                            <img src="/static/images/cardxiayige-3.png" alt="TeemIp - IPAM and DDI solution">
                        </a>
                    </div>
                <p>urls = [f"<a href="https://www.php.cn/link/2bb054c14409adcb28cb8d922e10a383">https://www.php.cn/link/2bb054c14409adcb28cb8d922e10a383</a>}" 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/somaxconnnet.ipv4.ip_local_port_range 足够宽
  • ss -snetstat -an | grep :80 | wc -l 观察真实连接数

基本上就这些。选哪种方式,取决于你手头的工具链、QPS 需求和维护成本偏好。脚本任务用 xargs,胶水逻辑用 Python,长期高负载用 Go/Rust,再配上合理的系统调优——并发请求就稳了。

以上就是Linux 并发发送请求怎么实现?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号