使用循环变量并行运行命令,最多同时运行 N 个。

4

我有一个服务器上的三千个文件。我可以通过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

我该如何将这个转换为我想要创建的并行调用呢?
谢谢。

1
Windows部分可能会让一切变得有些棘手,GNU Parallel可能会为您解决问题:http://www.gnu.org/software/parallel/ - Wolph
4个回答

3

安装Cygwin和GNU Parallel后,您可以使用以下命令同时进行200个并行下载,不间断地下载3000个文件:

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

非常感谢您的建议。这里的大括号代表什么意思?谢谢。 - Simon Kiely
1
{} 是 GNU Parallel 的默认替换字符串 - 类似于你的 %i。 - Ole Tange
非常感谢您。我本来就觉得是这样,只是希望能够得到确认。非常感激。您可能还可以为这个相关问题提供一些见解 - http://stackoverflow.com/questions/29942855/wget-ignoring-content-disposition 。非常感谢您的帮助。:) - Simon Kiely
1
@Adrian 我不知道有没有,但如果你已经安装了 gpg、wget、perl 和 make,那么这将帮你安装它:(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash - Ole Tange

0

不要费劲安装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可访问,因此根据记忆工作。


0

我怀疑您的命令是否有效,因为据我所知,迭代变量需要双百分号,即%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 窗口!)。这样做会给服务器带来很大的负载,我不确定这是否真的是前进的方式。但它确实可以做到您要求的。

编辑:如果您直接在 shell 上执行此命令,则上述说明适用于使用 .bat 文件,一个百分号就足够了。


0

一种替代方法 GNU parallel 方法 是使用老牌的xargs 命令加上 -P 选项:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接