【问题标题】:Run commands with a loop variable in parallel, at most N at the same time并行运行带有循环变量的命令,最多同时运行 N 个
【发布时间】:2015-04-21 10:45:12
【问题描述】:

我在服务器上有三千个文件。我可以通过 REST API 调用一次检索一个。我写了一个命令来检索这些文件。它运行良好,但在大约 200 次下载后我的登录超时。

我想并行而不是串行下载所有这些文件。理想情况下,我想一次检索文件 1-200,同时检索 200-400,同时检索 400-600....等等。

所以我的尝试:

FOR /L %i in (0,1,200) do wget --no-check-certificate --content-disposition  --load-cookies cookies.txt \ -p https://username:password@website.APICall.com/download/%i

如何将其转换为我想要创建的并行调用?

谢谢。

【问题讨论】:

标签: windows shell command-line wget


【解决方案1】:

安装 Cygwin 和 GNU Parallel 后,您可以下载 3000 个文件,其中 200 个并行下载持续运行:

seq 3000 | parallel -j 200 wget --no-check-certificate --content-disposition  --load-cookies cookies.txt -p https://username:password@website.APICall.com/download/{}

【讨论】:

  • 非常感谢您的建议。花括号在这里代表什么?谢谢。
  • {} 是 GNU Parallel 的默认替换字符串 - 类似于您的 %i 。
  • 非常感谢。我以为是这种情况,只是希望澄清一下。欣赏它。您也可以为这个相关问题提供一些见解 - stackoverflow.com/questions/29942855/… 。非常感谢:)。
  • @Adrian 我不知道,但如果你有 gpg、wget、perl 和 make,这将安装它:(wget -O - pi.dk/3 || curl pi.dk/ 3/ || 获取 -o - pi.dk/3) |重击
【解决方案2】:

不要经历 Cygwin 的麻烦;试图将 Windows 转变为 UNIX 会使问题复杂化并增加依赖层。使用 PowerShell。

如果您可以在超时之前下载 200 个文件,请将其分成三个作业:

invoke-command -asjob -scriptblock {$files = @(1..200);$files | foreach-object{ & wget --no-check-certificate --content-disposition  --load-cookies cookies.txt -p https://username:password@website.APICall.com/download/$_}};
invoke-command -asjob -scriptblock {$files = @(201..400);$files | foreach-object{ & wget --no-check-certificate --content-disposition  --load-cookies cookies.txt -p https://username:password@website.APICall.com/download/$_}};
invoke-command -asjob -scriptblock {$files = @(601..400);$files | foreach-object{ & wget --no-check-certificate --content-disposition  --load-cookies cookies.txt -p https://username:password@website.APICall.com/download/$_}};

或者获取Invoke-Parallel 并像这样使用它:

$filenames = @(1..600);    
invoke-parallel -InputObject $servers -throttle 200 -runspaceTimeout 30 -ScriptBlock { & wget --no-check-certificate --content-disposition  --load-cookies cookies.txt -p https://username:password@website.APICall.com/download/$_}

另一个(可能是最好的)选择是使用invoke-webrequest,但我不知道它是否能满足您的 cookie 要求。

免责声明:由于我目前无法访问 Windows 或您的 URL,因此凭记忆工作。

【讨论】:

    【解决方案3】:

    另一种to the GNU parallel method 是带有-P 选项的xargs

    $ seq 3000 | xargs -i '{}' -n 1 -P 200 wget <url_start>{}<url_end>
    

    【讨论】:

      【解决方案4】:

      我怀疑您的命令是否有效,因为据我所知,迭代器变量需要双倍百分比,即 %i 需要为 %%i

      关于并行化,你可以试试这个:

      FOR /L %%i IN (0,1,200) DO ( 
          start wget --no-check-certificate --content-disposition --load-cookies cookies.txt -p "https://username:password@website.APICall.com/download/%%i"
      )
      

      对于您的前 200 次下载,它会为每次下载生成一个单独的进程(和 shell 窗口!)。这样做会在服务器上造成大量负载,我不确定这是否真的是前进的道路。但它可以满足您的要求。

      编辑:以上注释适用于在.bat 文件中使用该命令,如果您直接在 shell 上执行此命令,则一个百分比就足够了。

      【讨论】:

        猜你喜欢
        • 2012-10-16
        • 1970-01-01
        • 2015-01-07
        • 2017-09-16
        • 2015-12-12
        • 2018-03-03
        • 1970-01-01
        • 1970-01-01
        • 2013-02-20
        相关资源
        最近更新 更多