Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Bash:在多个核上运行相同的程序_Linux_Bash_Parallel Processing_Multiprocessing - Fatal编程技术网

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

Linux Bash:在多个核上运行相同的程序,linux,bash,parallel-processing,multiprocessing,Linux,Bash,Parallel Processing,Multiprocessing,我可以访问一台机器,在那里我可以访问10个内核——我想实际使用它们。我习惯于在自己的机器上做这样的事情: for f in *.fa; do myProgram (options) "./$f" "./$f.tmp" done 我有10个文件,我想在上面做这件事——我们叫它们blah00.fa,blah01.fa。。。布拉赫09.fa 这种方法的问题是,我的程序一次只使用一个内核,在多核机器上这样做,我一次会使用一个内核10次,所以我不会最大限度地使用我的mahcine 如何更改脚本,使其

我可以访问一台机器,在那里我可以访问10个内核——我想实际使用它们。我习惯于在自己的机器上做这样的事情:

for f in *.fa; do
  myProgram (options) "./$f" "./$f.tmp"
done
我有10个文件,我想在上面做这件事——我们叫它们blah00.fa,blah01.fa。。。布拉赫09.fa

这种方法的问题是,我的程序一次只使用一个内核,在多核机器上这样做,我一次会使用一个内核10次,所以我不会最大限度地使用我的mahcine

如何更改脚本,使其同时运行我的所有10个.fa文件?我看了看,但我无法从中得到命令来做我想做的事情。

您可以使用

for f in *.fa; do
    myProgram (options) "./$f" "./$f.tmp" &
done
wait
这将并行启动所有作业,然后等到它们全部完成后再继续。如果作业多于内核,则可以启动所有作业,并让操作系统调度程序担心在输出中交换进程

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

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

但这不如使用
parallel
,因为旧作业完成时,您无法启动新作业,而且您也无法在启动10个作业之前检测旧作业是否已完成<代码>等待允许您在单个特定进程或所有后台进程上等待,但不让您知道任意一组后台进程何时完成。

使用GNU Parallel,您可以执行以下操作:

parallel myProgram (options) {} {.}.tmp ::: *.fa
发件人:

=完全安装=

GNU Parallel的完整安装非常简单:

./configure && make && make install
如果您不是root用户,则可以将~/bin添加到路径并安装到中 ~/bin和~/share:

./configure --prefix=$HOME && make && make install
或者,如果您的系统缺少“make”,您可以简单地复制src/parallel src/sem src/nice将src/sql加载到路径中的一个目录中

=最小安装量=

如果您只需要并行,而没有安装“make”(可能是 系统是旧的或Microsoft Windows):


观看介绍视频以了解更多信息:

您尝试了gnu parallel?什么对你不起作用?你试过在那个答案中使用gnu并行建议吗?
seq 0 10 | parallel myProgram-opt1-opt2./blah{}.fa./blah{}.tmp
是的,我试过使用并行。问题:在多核的机器上,它没有安装,而且我没有sudo访问权限,因此无法使用并行:(安装它不需要是root用户;下载源代码并运行
/configure--prefix=${HOME};make;make install
,即可将其安装到主目录中。下一版本的Bash将有一个选项(
等待-n
).目前,您可以执行类似的操作,但由于一些错误,这有点疯狂,这些错误也将在下一版本中修复。
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/
# Wait while instance count less than $3, run additional instance and exit
function runParallel () {
    cmd=$1
    args=$2
    number=$3
    currNumber="1024"
    while true ; do
        currNumber=`ps -e | grep -v "grep" | grep " $1$" | wc -l`
        if [ $currNumber -lt $number ] ; then
            break
        fi
        sleep 1
    done
    echo "run: $cmd $args"
    $cmd $args &
}

loop=0
# We will run 12 sleep commands for 10 seconds each 
# and only five of them will work simultaneously
while [ $loop -ne 12 ] ; do
    runParallel "sleep" 10 5
    loop=`expr $loop + 1`
done