并行执行四个任务...我该怎么做?


23

我在目录上有一堆PNG图片。我有一个名为pngout的应用程序,可以运行它来压缩这些图像。该应用程序由我执行的脚本调用。问题在于此脚本一次执行一个,如下所示:

FILES=(./*.png)
for f in  "${FILES[@]}"
do
        echo "Processing $f file..."
        # take action on each file. $f store current file name
        ./pngout -s0 $f R${f/\.\//}
done

一次只处理一个文件,需要很多时间。运行此应用程序后,我看到CPU仅为10%。因此,我发现可以将这些文件分为4个批次,将每个批次放入一个目录中,并从4个终端窗口,4个进程中触发4个,因此我同时拥有4个脚本实例,同时处理这些图像和工作需要1/4的时间。

第二个问题是我浪费了时间分割图像和批处理并将脚本复制到四个目录,打开4个终端窗口,等等。

如何用一个脚本执行而无需划分任何内容?

我的意思是两件事:首先,我如何从bash脚本中向后台启动进程?(只需添加&到末尾?)第二:在发送第四个任务后如何停止将任务发送到后台,并让脚本等待任务结束?我的意思是说,只是在一个任务结束时将一个新任务发送到后台,同时始终保持4个任务并行?如果我不这样做,则循环会将大量任务发送到后台,并且CPU会阻塞。


Answers:


33

如果您有一个副本,xargs该副本支持使用并行执行-P,则只需执行

printf '%s\0' *.png | xargs -0 -I {} -P 4 ./pngout -s0 {} R{}

对于其他想法,Wooledge Bash Wiki 在“过程管理”文章中有一个部分,确切描述了您想要的内容。


2
还为这种情况设计了“ gnu parallel”和“ xjobs”。这主要是您喜欢的口味问题。
wnoise 2012年

您能解释一下建议的命令吗?谢谢!
Eugene S

1
@EugeneS您能否更详细地说明哪个部分?printf收集所有png文件,并通过管道将它们传递给xargs,xargs从标准输入中收集参数,并将它们组合为pngoutOP想要运行的命令的参数。关键选项是-P 4,它告诉xargs最多使用4个并发命令。
jw013

2
抱歉,不够精确。我特别感兴趣,为什么您printf在这里使用函数而不是常规函数ls .. | grep .. *.png?我也对xargs您使用的参数(-0-I{})感兴趣。谢谢!
Eugene S

3
@EugeneS用于最大的正确性和鲁棒性。文件名不是行,并且ls不能用于可移植,安全地解析文件名。用来分隔文件名的唯一安全字符是\0/,因为其他所有字符(包括\n)都可以成为文件名本身的一部分。的printf用途\0来分隔文件名和-0运筹学xargs这一点。该-I{}通知xargs更换{}的说法。
jw013

8

除了已经提出的解决方案之外,您还可以创建一个描述如何从未压缩的文件制作压缩文件的文件,并用于make -j 4并行运行4个作业。问题是您将需要对压缩文件和未压缩文件命名不同,或者将它们存储在不同目录中,否则将无法编写合理的生成规则。



5

要回答您的两个问题:

  • 是的,在行的末尾添加&会指示您shell启动后台进程。
  • 使用该wait命令,可以要求外壳程序在后台等待所有进程完成,然后再继续进行操作。

这是修改后的脚本,j用于跟踪后台进程的数量。当NB_CONCURRENT_PROCESSES到达,该脚本将重置j为0,并恢复它的执行之前等待所有的后台进程完成。

files=(./*.png)
nb_concurrent_processes=4
j=0
for f in "${files[@]}"
do
        echo "Processing $f file..."
        # take action on each file. $f store current file name
        ./pngout -s0 "$f" R"${f/\.\//}" &
        ((++j == nb_concurrent_processes)) && { j=0; wait; }
done

1
这将等待四个并发进程中的最后一个,然后再启动另外四个进程。也许应该构建一个包含四个PID的数组,然后等待这些特定的PID?
尼尔斯2012年

只是为了解释我对代码的修正:(1)作为样式问题,请避免所有大写变量名,因为它们可能与内部shell变量冲突。(2)添加了对$f等的引用。(3)[用于POSIX兼容脚本,但[[始终首选纯bash 。在这种情况下,((更适合算术。
2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.