Bash脚本:如何同步调用异步函数及确保du在批量HTTP请求后执行?
关于Bash脚本异步/同步执行与HTTP请求优化的问题解答
1. Bash脚本中同步调用异步函数的方法
Bash里默认的命令/函数调用都是同步的——脚本会等当前命令执行完才继续下一行。如果你的函数本身是异步实现的(比如函数内部加了&让任务后台运行),要同步调用的话有两种方式:
- 去掉函数内部的
&,让函数执行时阻塞脚本直到完成; - 如果必须保留后台执行,在调用函数后加上
wait命令,脚本会等待该后台进程结束再继续。比如:# 假设http_req是异步函数(内部带&) http_req_1 1000000 & wait $! # 等待刚才启动的后台进程($!是上一个后台进程的PID) # 之后的代码会在http_req_1完成后执行
2. 确保du -sh仅在HTTP请求完成后运行
如果你的http_req_1、http_req_2是同步执行的(即函数调用时会阻塞直到请求完成),那脚本默认就会按顺序执行:先跑完http_req_1,再执行du -sh,完全不需要额外处理。
但如果这些请求函数是后台运行的(比如为了并发),就必须用wait命令等待所有后台请求完成后再执行du。示例:
#!/bin/bash # 启动多个后台请求 http_req_1 1000000 & http_req_2 100000 & # 等待所有后台进程结束 wait # 现在执行磁盘检查 Size=$(du -sh ./PATH)
⚠️ 注意:你原来代码里的sleep X完全不可靠——请求的耗时是不确定的,X设小了可能请求还没完成就跑du,设大了纯纯浪费时间,一定要用wait替代。
3. 百万次HTTP请求的优化思路
百万次单个请求挨个执行效率极低,这里给几个实用优化方向:
- 控制并发批量执行:用
xargs或parallel工具批量发起请求,同时限制并发数(避免压垮目标服务器或本地网络)。比如用curl的并行模式:# 把请求参数放进一个文件,每行一个参数 cat params.txt | xargs -P 100 -I {} curl -X POST https://your-api.com -d "data={}" # -P 100 表示同时跑100个并发请求 - 复用HTTP连接:curl加上
--keep-alive参数,复用TCP连接,减少握手开销,大幅提升批量请求效率; - 批量记录失败请求:不用每次请求都检查状态码,而是把请求结果(成功/失败)输出到日志文件,全部请求完成后再统一分析日志统计失败情况,节省单次检查的开销;
- 使用专用工具:比如
httpx、oha这类专门做批量HTTP请求的工具,它们内置了并发控制、连接复用、结果汇总等功能,比自己写Bash函数高效得多。
关于你给出的代码写法差异
你提供的代码片段是串行执行逻辑:
#!/bin/bash http_req_1 1000000 # 等这个请求完全完成 sleep X # 无意义的等待 Size=$(du -sh ./PATH) # 检查磁盘 http_req_2 10... # 再跑第二个请求
如果改成后台并发+wait的写法,差异非常明显:
- 原写法是串行执行:先跑第一个请求,再查磁盘,最后跑第二个请求;
- 并发写法是并行执行:两个请求同时跑,等都完成后再查磁盘,效率高得多;
- 原写法里的
sleep X完全多余,甚至可能导致逻辑错误,一定要删掉,用wait替代等待逻辑。
内容的提问来源于stack exchange,提问作者mizenetofa1989
相关产品推荐
相关产品推荐

