为什么我看到 Bash 中后台进程的速度在下降 returns?
Why do I see diminishing returns on speed of backgrounding processes in Bash?
我想弄清楚为什么在 Bash 脚本中对大量进程进行后台处理时速度会下降 returns。类似于:
function lolecho() {
echo "lol" &> /dev/null
}
c=0
while true; do
for i in $(seq 1 1000); do
lolecho &
((c+=1))
if [[ $((c%1000)) -eq 0 ]]; then
echo "Count $c"
fi
done
sleep .1
done
它尖叫着高达 10,000、20,0000...但随后它开始放慢它可以在 70,000...80,0000 左右建立后台进程的速度。就像这样,计数打印到屏幕的速度会以看似线性的量减慢,具体取决于总数。
机器 运行 后台作业基本上立即完成的速度不应该是一致的,无论添加和关闭了多少?
答案是使用 Linux 内置 wait 命令:
function lolecho() {
echo "lol" &> /dev/null
}
c=0
while true; do
for i in $(seq 1 1000); do
lolecho &
((c+=1))
if [[ $((c%1000)) -eq 0 ]]; then
echo "Count $c"
fi
done
wait # <------------
done
该脚本现在生成的进程总体上一致且更快。
评论有点长……OP 使用 wait
命令的解决方案很好,但可能需要稍微调整一下……
编码(在 OP 答案中):
- 生成了 1K 个后台进程(可能会引起一些系统资源争用)
- 我们等待所有 1K 个进程完成,然后我们...
- 启动一组新的 1K 进程
为了获得更一致的吞吐量,我想:
- 考虑限制并发后台进程的数量(例如,50?100?);将需要 运行 在您的特定系统上进行一些测试)以减少系统资源争用,然后 ...
- 使用
wait -n
在一个进程完成后立即启动一个新进程
诚然,对于这个简单的示例 (lolecho()
),这可能不会产生太大影响,但如果进行一些实际工作,您应该会发现您保持了相当稳定的工作量。
几个使用 wait -n
的例子: and
如果使用不支持 -n
标志的旧版本 bash
,
我想弄清楚为什么在 Bash 脚本中对大量进程进行后台处理时速度会下降 returns。类似于:
function lolecho() {
echo "lol" &> /dev/null
}
c=0
while true; do
for i in $(seq 1 1000); do
lolecho &
((c+=1))
if [[ $((c%1000)) -eq 0 ]]; then
echo "Count $c"
fi
done
sleep .1
done
它尖叫着高达 10,000、20,0000...但随后它开始放慢它可以在 70,000...80,0000 左右建立后台进程的速度。就像这样,计数打印到屏幕的速度会以看似线性的量减慢,具体取决于总数。
机器 运行 后台作业基本上立即完成的速度不应该是一致的,无论添加和关闭了多少?
答案是使用 Linux 内置 wait 命令:
function lolecho() {
echo "lol" &> /dev/null
}
c=0
while true; do
for i in $(seq 1 1000); do
lolecho &
((c+=1))
if [[ $((c%1000)) -eq 0 ]]; then
echo "Count $c"
fi
done
wait # <------------
done
该脚本现在生成的进程总体上一致且更快。
评论有点长……OP 使用 wait
命令的解决方案很好,但可能需要稍微调整一下……
编码(在 OP 答案中):
- 生成了 1K 个后台进程(可能会引起一些系统资源争用)
- 我们等待所有 1K 个进程完成,然后我们...
- 启动一组新的 1K 进程
为了获得更一致的吞吐量,我想:
- 考虑限制并发后台进程的数量(例如,50?100?);将需要 运行 在您的特定系统上进行一些测试)以减少系统资源争用,然后 ...
- 使用
wait -n
在一个进程完成后立即启动一个新进程
诚然,对于这个简单的示例 (lolecho()
),这可能不会产生太大影响,但如果进行一些实际工作,您应该会发现您保持了相当稳定的工作量。
几个使用 wait -n
的例子:
如果使用不支持 -n
标志的旧版本 bash
,