我希望我的代码同时运行多个进程。这下面的例子代码和来源是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 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