我运行一个非常简单的shell脚本,它对我每天下载的文件执行一些转换。通常它是一个包含六个文件的zip存档,然后在将内容插入数据库之前,我将在五个不同的步骤中处理它。第一步需要5-8分钟/文件,并受CPU限制。
我有两台计算机执行此任务,一台有两个核心,另一台有四核和超线程。由于第一步在我目前的设置中需要30多分钟,我想多线程。
第一步基本上是
for file in *.txt
dosomething "$file" "$file.csv"
done
在我的2核计算机上,我想在parallell中处理两个文件,在我的8线程机器上我想处理parallell中的所有六个文件(如果存档包含9个文件将处理它的那一天会很好很好)。必须在下一步之前处理所有文件(速度要快得多)。
如何启动合适数量的线程/进程,然后在上一步完成之前不要开始执行下一步?
答案 0 :(得分:1)
Shell脚本不是分发作业的好地方。从根本上说,他们只是调用一系列程序,这些程序可能会也可能不会使用多个核心。
您仍然可以通过在后台运行作业来实现某种程度的并行性(通过在命令后放置&
)。这允许您的脚本在特定命令继续在后台运行时继续执行任何想要执行的操作。之后运行wait
命令会强制您的脚本等待所有后台作业完成后再继续。
您还可以将各个命令的PID存储在数组中并专门等待。 See this answer了解有关如何正确执行此操作的详细信息。
对于您的用例,您可以检查可用内核的数量和背景/等待完成的许多过程。您可以通过grepping / proc / cpuinfo来检查您拥有多少个核心:cat /proc/cpuinfo | grep -c processor