一个脚本如何同时运行多个进程?

一个脚本如何同时运行多个进程?

我希望我的代码同时运行多个进程。这下面的例子代码和来源是StackExchange(Unix&Linux)网站。

> #!/bin/bash
> for i in $(cat lis.txt); do
>      echo "$i"
>      wait
>      mkdir "$i"
>  done

这个简单的代码旨在从文本文件中包含的名称列表创建目录列表。当我们运行代码时,它会一一创建文件夹。如何修改此代码以同时创建所有文件夹,即同时完成所有工作?

答案1

该脚本将为 中的每一行创建一个目录list.txt。它可以处理空格,但不能处理其他奇怪的字符(例如\r or\t` 等,但这不应该是这里的问题):

#!/usr/bin/env bash
while IFS= read -r dir
do
  mkdir -- "$dir" &
done < list.txt

&作业发送到后台,以便脚本将立即继续,而不是等待mkdir完成。这几乎肯定是无法检测到的,mkdir但对于其他操作可能很重要。

为了将来参考,如果您需要能够处理任意字符,请改用read -r。此外,对于更复杂的并行化任务,请查看GNU并行

答案2

如果您有 GNU Parallel,您可以执行以下任一操作:

parallel mkdir :::: list.txt
parallel -a list.txt mkdir
cat list.txt | parallel mkdir 

所有新计算机都具有多个内核,但大多数程序本质上是串行的,因此不会使用多个内核。然而,许多任务是极其可并行化的:

  • 在许多文件上运行相同的程序
  • 对文件中的每一行运行相同的程序
  • 为文件中的每个块运行相同的程序

GNU Parallel 是一个通用并行器,可以轻松地在同一台计算机或多台您可以通过 ssh 访问的计算机上并行运行作业。

如果您想要在 4 个 CPU 上运行 32 个不同的作业,则并行化的直接方法是在每个 CPU 上运行 8 个作业:

简单的调度

相反,GNU Parallel 在完成后会生成一个新进程 - 保持 CPU 处于活动状态,从而节省时间:

GNU 并行调度

安装

如果您的发行版未打包 GNU Parallel,您可以进行个人安装,不需要 root 访问权限。这样做可以在 10 秒内完成:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

对于其他安装选项,请参阅http://git.savannah.gnu.org/cgit/parallel.git/tree/README

了解更多

查看更多示例:http://www.gnu.org/software/parallel/man.html

观看介绍视频:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

浏览本教程:http://www.gnu.org/software/parallel/parallel_tutorial.html

注册电子邮件列表以获得支持:https://lists.gnu.org/mailman/listinfo/parallel

相关内容