我正在尝试在 bash(在 CentOs 上)中通过多个进程运行一个函数。 该函数对curl进行不同的过滤:
STEP=50
function filtering() {
local i="$1"
curl -s -g -X GET 'https://url.com?filter='$i'_filter'
}
for (( i=0; i<=TOTAL; i+=STEP )); do
filtering "$i"
done
wait
按原样运行即可工作。然而,当我在 10 个进程中运行该函数时,它的行为很奇怪,每次都会带来不同的结果,而且大多不可靠(根据生成的数字与上面的串行过滤相比)。我的代码是:
PARALLEL_PROCESSES=10
ACTIVE_PROCESSES=0
for (( i=0; i<=TOTAL; i+=STEP )); do
filtering "$i" > /dev/null 2>&1 &
(( ACTIVE_PROCESSES++ ))
if (( ACTIVE_PROCESSES >= PARALLEL_PROCESSES )); then
wait -n 2> /dev/null
(( ACTIVE_PROCESSES-- ))
fi
done
wait
当我检查所有打印的过滤器时,一切看起来都很好。我认为
curl
没有得到正确的结果。
GNU parallel
也没有完成我的任务。我认为调试自己的并行化会更容易。
我非常感谢有关如何调试内部发生/错误的实用建议,以及实现我的目标的任何替代建议。
为了调试,请尝试将外部调用替换为您控制的内容。
我不知道
unreliable
结果是什么,你能用重现它们吗
#!/bin/bash
STEP=50
TOTAL=2000
filtering() {
local j="$1"
sleeptime="0.$((RANDOM%10))"
sleep $sleeptime
printf "Filter %s\n" $j #l -s -g -X GET 'https://url.com?filter='$i'_filter'
}
PARALLEL_PROCESSES=30
ACTIVE_PROCESSES=0
for (( i=0; i<=TOTAL; i+=STEP )); do
filtering "$i" & # > /dev/null 2>&1 &
(( ACTIVE_PROCESSES++ ))
if (( ACTIVE_PROCESSES >= PARALLEL_PROCESSES )); then
wait -n 2> /dev/null
(( ACTIVE_PROCESSES-- ))
fi
done
当它重现您的问题时,您可以将脚本更改为最小的复杂性。将步骤更改为 1,将 TOTAL 更改为 10 可能会有所帮助。
您可能会注意到,非并行和并行方法中的步骤数不同(TOTAL % STEP 与 ACTIVE_PROCESSES)以及并行情况输出中的“随机”顺序。
当它没有重现您的问题时,则表示
curl
(或远程站点)出现了问题。在 curl -v
旁边,您可能会尝试在没有 get 或其他网站的情况下更改某些内容。