Bash:在多个核心上运行相同的程序

Joe*_*Joe 12 linux parallel-processing bash multiprocessing

我可以访问一台可以访问10个内核的机器 - 我想实际使用它们.我习惯在自己的机器上做的事情是这样的:

for f in *.fa; do
  myProgram (options) "./$f" "./$f.tmp"
done
Run Code Online (Sandbox Code Playgroud)

我有10个文件我想这样做 - 让我们称之为blah00.fa,blah01.fa,... blah09.fa.

这种方法的问题是myProgram一次只使用1个核心,并且在多核机器上这样做我一次使用1个核心10次,所以我不会使用我的mahcine来它的最大能力.

我怎么能改变我的脚本,以便它同时运行我的所有10个.fa文件?我看着在多个核心的bash运行一个循环进程,但我无法从中获取命令来完成我想要的操作.

che*_*ner 11

你可以用

for f in *.fa; do
    myProgram (options) "./$f" "./$f.tmp" &
done
wait
Run Code Online (Sandbox Code Playgroud)

这将并行启动所有工作,然后等到它们全部完成后再继续.如果您有比核心更多的作业,您将启动所有这些作业,并让您的操作系统调度程序担心交换进程.

一种修改是一次启动10个作业

count=0
for f in *.fa; do
    myProgram (options) "./$f" "./$f.tmp" &
    (( count ++ ))        
    if (( count = 10 )); then
        wait
        count=0
    fi
done
Run Code Online (Sandbox Code Playgroud)

但这不如使用,parallel因为你不能像旧的工作那样开始新的工作,而且在你设法开始10个工作之前,你也无法检测到旧的工作是否已完成.wait允许您等待单个特定进程或所有后台进程,但不会在任何一组任意后台进程完成时通知您.

  • 下一版本的Bash将有一个选项(`wait -n`).目前你可以做[this](https://gist.github.com/ormaaj/3911059)这样的事情,但由于一些错误也会在下一个版本中得到解决,这有点活泼. (2认同)

Ole*_*nge 7

使用GNU Parallel,您可以:

parallel myProgram (options) {} {.}.tmp ::: *.fa
Run Code Online (Sandbox Code Playgroud)

来自:http://git.savannah.gnu.org/cgit/parallel.git/tree/README

=完全安装=

完全安装GNU Parallel非常简单:

./configure && make && make install
Run Code Online (Sandbox Code Playgroud)

如果你不是root用户,可以在你的路径中添加〜/ bin并安装在〜/ bin和〜/ share中:

./configure --prefix=$HOME && make && make install
Run Code Online (Sandbox Code Playgroud)

或者,如果您的系统缺少'make',您只需将src/parallel src/sem src/niceload src/sql复制到路径中的目录即可.

=最小安装=

如果你只需要并行并且没有安装'make'(可能系统是旧的或Microsoft Windows):

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem
mv parallel sem dir-in-your-$PATH/bin/
Run Code Online (Sandbox Code Playgroud)

观看介绍视频以了解更多信息:https://www.youtube.com/playlist?list = PL284C9FF2488BC6D1