Ton*_*ony 41 unix linux parallel-processing bash shell
我有一个shell脚本
所以伪代码看起来像这样
file1.sh
#!/bin/bash
for i in $(seq 1 1000)
do
Generating random numbers here , sorting and outputting to file$i.txt
done
Run Code Online (Sandbox Code Playgroud)
有没有办法运行这个shell脚本parallel
来充分利用多核CPU?
在这一刻, ./file1.sh
按顺序执行1到1000次运行并且速度非常慢.
谢谢你的帮助.
Jon*_*rsi 85
另一个非常方便的方法是使用gnu parallel,如果你还没有它,那么非常值得安装; 如果任务不一定花费相同的时间,这是非常宝贵的.
seq 1000 | parallel -j 8 --workdir $PWD ./myrun {}
Run Code Online (Sandbox Code Playgroud)
将启动./myrun 1
,./myrun 2
等,确保一次运行8个工作.如果要一次在多个节点上运行,例如在PBS作业中,它也可以采用节点列表; 我们向用户提供有关如何在我们的系统上执行此操作的说明.
更新以添加:您希望确保使用gnu-parallel,而不是更多限制的moreutils包中的相同名称的实用程序(这里描述了两者的不同历史.)
And*_*ahl 42
查看bash子shell,这些子shell可以用来并行运行脚本的一部分.
我没有测试过这个,但这可能是一个开始:
#!/bin/bash
for i in $(seq 1 1000)
do
( Generating random numbers here , sorting and outputting to file$i.txt ) &
if (( $i % 10 == 0 )); then wait; fi # Limit to 10 concurrent subshells.
done
wait
Run Code Online (Sandbox Code Playgroud)
Ton*_*roy 14
为了让事情并行运行,你可以在shell命令的末尾使用'&'在后台运行它,然后wait
默认情况下(即没有参数)等到所有后台进程都完成.所以,也许可以并行启动10,然后等待,然后再做10次.您可以使用两个嵌套循环轻松完成此操作.