【问题标题】:Multiple curl in parallel with limitations多个 curl 并行有限制
【发布时间】:2018-09-08 11:52:26
【问题描述】:

我有一个 json 文件,其中包含包含 url(以及其他内容)的条目,我使用 curl 检索该文件。 我希望能够一次运行多次循环以加快速度,但也希望限制并行卷曲的数量,以避免被远程服务器踢出。 现在,我的代码就像

  jq -r '.entries[] | select(.enabled != false) | .id,.unitUrl' $fileIndexFeed | \
  while read unitId; do
    read -r unitUrl
    if ! in_array tabAnnoncesExistantesIds $unitId; then
      fullUnitUrl="$unitUrlBase$unitUrl"
      unitFile="$unitFileBase$unitId.json"
      if [ ! -f $unitFile ]; then
        curl -H "Authorization:$authMethod $encodedHeader" -X GET $fullUnitUrl -o $unitFile
      fi
    fi
   done

如果我在 curl 结束时使用简单的 &,它将运行大量并发请求,我可能会被踢。 所以,问题是(我想):如何知道用 & 运行的 curl 已经完成了它的工作?如果我能够检测到这一点,那么我想我可以测试、增加和减少一个变量来告诉正在运行的卷曲的数量。

谢谢

【问题讨论】:

  • 在运行 curl 命令帮助之前会检查 ps -ef|grep -i curl |wc -l 吗?如果系统中运行的 curl 进程的数量已达到您定义的限制,您可以保持检查睡眠。一旦进程数下降,您可以运行下一个 curl。这是必需的吗?

标签: bash unix curl parallel-processing


【解决方案1】:

使用 GNU Parallel 来控制并行作业的数量。将您的 curl 命令写入文件,以便查看和检查它们:

commands.txt

curl "something" "somehow" "toSomewhere"
curl "somethingelse" "someotherway" "toSomewhereElse"

然后,如果您希望一次运行的作业不超过 8 个,请运行:

parallel -j 8 --eta -a commands.txt

或者您可以将命令写入 GNU Parallelstdin:

jq ... | while read ...; do
    printf "curl ..." 
done | parallel -j 8 

【讨论】:

  • 这确实为我指明了正确的方向:我将我的过程分成几个部分以提高效率,因为 bash 中的 in_array 函数非常缓慢。我得到了完整的 url 列表,在 php 中清理它,生成了一个文本文件,然后才使用 bash 来并行它。而且它要简单得多,因为所有的预处理都是在外面完成的。无论如何,非常感谢,你为我节省了几个小时。
【解决方案2】:

使用 Bash 函数:

doit() {
  unitId="$1"
  unitUrl="$2"
  if ! in_array tabAnnoncesExistantesIds $unitId; then
    fullUnitUrl="$unitUrlBase$unitUrl"
    unitFile="$unitFileBase$unitId.json"
    if [ ! -f $unitFile ]; then
      curl -H "Authorization:$authMethod $encodedHeader" -X GET $fullUnitUrl -o $unitFile
    fi
  fi
}

jq -r '.entries[] | select(.enabled != false) | .id,.unitUrl' $fileIndexFeed |
  env_parallel -N2 doit

env_parallel 将导入环境,因此所有 shell 变量都可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-03
    • 2019-03-04
    • 2018-08-26
    • 1970-01-01
    • 2021-02-17
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多