并行执行curl操作的Bashscript

并行执行curl操作的Bashscript,bash,curl,gnu-parallel,Bash,Curl,Gnu Parallel,我有一个URL列表,我喜欢用CURL加载它,并用bash脚本对结果执行一些操作。 因为它几乎有10万个请求,所以我喜欢并行运行。 我已经研究过GNU并行,但我要如何将它们粘合在一起呢?谢谢 bashscript: while read URL; do curl -L -H "Accept: application/unixref+xml" $URL > temp.xml; YEAR=$(xmllint --xpath '//year' temp.xml); MONTH=$(xmllint

我有一个URL列表,我喜欢用CURL加载它,并用bash脚本对结果执行一些操作。 因为它几乎有10万个请求,所以我喜欢并行运行。 我已经研究过GNU并行,但我要如何将它们粘合在一起呢?谢谢

bashscript:

while read URL; do
curl -L -H "Accept: application/unixref+xml" $URL > temp.xml;

YEAR=$(xmllint --xpath '//year' temp.xml);
MONTH=$(xmllint --xpath '(//date/month)[1]' temp.xml);

echo "$URL;$YEAR;$MONTH" >> results.csv;

sed -i '1d' urls.txt;

done < urls.txt;
读取URL时
;做
curl-L-H“Accept:application/unixref+xml”$URL>temp.xml;
YEAR=$(xmllint--xpath'//YEAR'temp.xml);
MONTH=$(xmllint--xpath'(//日期/月份)[1]'temp.xml);
echo“$URL;$YEAR;$MONTH”>>results.csv;
sed-i'1d'url.txt;
完成
您不应该在发出每个HTTP请求时修改URL的输入列表。如果让多个appender从不同的进程写入同一个输出文件,很可能会以眼泪告终

将大多数命令放在一个单独的脚本中(例如,
geturl.sh
),可以使用URL作为参数调用该脚本,并将其输出行写入标准输出:

#!/usr/bin/env bash
URL="${1}"
curl -L -H "Accept: application/unixref+xml" "${URL}" > /tmp/$$.xml
YEAR="$(xmllint --xpath '//year' /tmp/.xml)"
MONTH="$(xmllint --xpath '(//date/month)[1]' /tmp/$$.xml)"
rm -f /tmp/$$.xml
echo "${URL};${YEAR};${MONTH}"
然后按如下方式调用(这里我们让
parallel
逐行合并来自不同线程的输出):

parallel——行缓冲区geturl.shresults.csv

从循环中读取时,我不会在循环中修改
url.txt
。充其量,这似乎没有必要。谢谢,这很有效。我对100个URL进行了测试,但它在时间上的表现似乎并不比串行版本好。可能是卷曲的问题吗?我正在运行CygWinTry并行运行更多的作业:
parallel-j100
还请注意--line buffer比默认值慢得多(一次缓冲一个完整的作业)。多亏添加了-j100,性能得到了提高。有没有--line buffer的替代方案?不确定您是否需要--line buffer-出于谨慎,我把它扔了进去。我在没有--line buffer的情况下并行运行,它仍然可以工作,尽管它不能加快进程。我运行了一些测试,无论我选择-j100还是-j5,运行整个批次总是需要6分钟,这难道不能改进吗?还是下载URL只是一个瓶颈?不幸的是,我无法在CygWIn中运行多线程Curl。。
parallel --line-buffer geturl.sh < urls.txt > results.csv