我有多个bash脚本,我试过"并行化"在主bash脚本中。
Bash脚本:
#!/bin/bash
SHELL=/bin/bash
bash /home/.../a.sh &
bash /home/.../b.sh &
wait
bash /home/.../c.sh &
bash /home/.../d.sh &
bash /home/.../e.sh &
wait
echo "Done paralleling!"
exit 0
我已经正常运行脚本(没有&符号)和&符号,我没有看到任何明显的处理时间差异,导致我相信某些内容可能无法正确编码/最有效的方式。
答案 0 :(得分:1)
你很可能是正确的。具有并行性的是它允许您抓取多个资源以并行使用。如果 - 并且只有 - 资源是您的限制因素,这可以提高您的速度。
所以 - 例如 - 如果你正在从磁盘读取 - 从磁盘读取操作限制你的几率很好,并行做更多的事情也没有帮助 - 事实上,由于争用可以减慢进程。 (磁盘必须寻求为多个进程提供服务,而不仅仅是“开始”和序列化读取)。
所以它确实归结为你的脚本实际上做了什么以及为什么它变慢了。检查它的最佳方法是通过分析它。
在基础层面,像truss或strace这样的东西可能会有所帮助。
e.g。
strace -fTtc /home/../e.sh
查看正在进行的系统调用类型,以及他们消耗的总时间。
答案 1 :(得分:1)
在经典计算机科学理论中,资源争用被称为“颠簸”。
(在好日子里,当一个5兆字节的磁盘驱动器可能是一台小型洗衣机的大小时,我们常称它为“Maytag Mode”,因为可怜的东西看起来像是一台Maytag洗衣机“旋转”循环!)
如果你描绘了由争用引起的性能曲线,它向上倾斜,然后突然形成“肘”形状:它直线向上,指数。我们称之为“撞墙”。
在这个脚本(如果你只是好奇......)上摆弄一个有趣的事情是将wait
语句放在几个地方。 (确保你正确地做到了这一点......)允许,例如,两个实例运行,等待所有这些实例完成,然后再三个,等等上。看看它是否有用更快,如果是,请尝试三。等等。你可能会找到一个“甜蜜点”。
或者......不是。 (不要花太多时间用它。它看起来不值得。)