如何实现带并发数量限制的多Curl并行请求?
实现带并发限制的批量curl请求处理
看起来你现在用串行的while循环处理curl请求,效率确实上不去,而且还没法控制并发数。我给你两个常用的解决方案,都是Linux/Unix下现成的工具,能轻松实现并行请求还能限制数量,避免触发服务器的反爬机制。
方法一:用xargs(系统默认自带,无需额外安装)
xargs的-P参数可以指定并行进程数,-n参数控制每次传给命令的参数个数。因为你需要同时处理unitId和unitUrl两个字段,我们可以先写一个小脚本封装逻辑,再用xargs调用它:
1. 编写处理脚本 process_url.sh
#!/bin/bash # 接收传入的两个参数:unitId 和 unitUrl unitId="$1" unitUrl="$2" # 替换成你的id存在性判断逻辑 if! [[ " ${tabAnnoncesExistantesIds[@]} " =~ " ${unitId} " ]]; then # 补全你的fullUnitUrl拼接逻辑 fullUnitUrl="${unitUrl}" # 执行curl请求,这里可以根据需求加参数(比如保存文件、设置超时等) curl -s --connect-timeout 10 "$fullUnitUrl" # 如果需要保存到文件,可以改成: # curl -s --connect-timeout 10 -o "result_${unitId}.txt" "$fullUnitUrl" fi
2. 给脚本加执行权限
chmod +x process_url.sh
3. 执行主命令
因为子进程默认不会继承父进程的数组,所以先把tabAnnoncesExistantesIds导出,再用jq提取字段传给xargs:
export tabAnnoncesExistantesIds jq -r '.entries[] | select(.enabled != false) | "\(.id) \(.unitUrl)"' "$fileIndexFeed" | xargs -n2 -P5./process_url.sh
这里-P5表示最多同时跑5个curl请求,你可以根据服务器的容忍度调整这个数字(建议从3-5开始试)。
方法二:用GNU Parallel(更灵活,适合复杂场景)
如果你的系统没有Parallel,可以用包管理器安装:
- Debian/Ubuntu:
sudo apt install parallel - CentOS/RHEL:
sudo yum install parallel
Parallel的语法更直观,而且自带很多实用功能(比如失败重试、进度条等)。你可以直接把逻辑写在命令里,不用单独脚本:
export tabAnnoncesExistantesIds jq -r '.entries[] | select(.enabled != false) | "\(.id) \(.unitUrl)"' "$fileIndexFeed" | parallel -j5 ' unitId={1} unitUrl={2} if! [[ " ${tabAnnoncesExistantesIds[@]} " =~ " ${unitId} " ]]; then fullUnitUrl="${unitUrl}" curl -s --connect-timeout 10 "$fullUnitUrl" fi '
这里-j5同样是限制5个并行进程,{1}和{2}对应每行的第一个和第二个字段(也就是unitId和unitUrl)。
一些注意事项
- 并发数调整:不要贪多!如果并发数太高,很容易被服务器判定为恶意请求而封禁IP,建议先从小数开始测试,观察服务器的响应情况再调整。
- 错误处理:可以给curl加
--fail参数,让请求失败时返回非0退出码,方便后续排查;也可以在脚本里记录失败的请求ID和URL到日志文件。 - 数组传递:如果你的
tabAnnoncesExistantesIds数组很大,导出可能不太方便,也可以把数组内容写入临时文件,在脚本里读取这个文件来判断ID是否存在。
内容的提问来源于stack exchange,提问作者MarvinLeRouge
相关产品推荐
相关产品推荐

