我运行一个非常简单的shell脚本,对我每天下载的文件执行一些转换。通常,它是一个包含六个文件的zip归档文件,在将内容插入数据库之前,我会分五个不同的步骤对其进行处理。第一步需要5-8分钟/个文件,并且受到CPU的限制。
我有两台执行此任务的计算机,一台有两个核心,另一台有四个核心和超线程。由于第一步在我当前的设置中需要几分钟的30+时间,所以我想将其多线程。
第一步基本上是
for file in *.txt
dosomething "$file" "$file.csv"
done在我的2核计算机上,我想并行处理两个文件,在我的8线程机器上,我想并行处理所有6个文件(如果归档包含9个文件的那一天能很好地处理,那就太好了)。所有文件都必须在下一步之前处理(这要快得多)。
如何启动适当数量的线程/进程,然后在前一步完全完成后才开始执行下一步?
发布于 2018-04-14 00:14:39
Shell脚本不是进行作业分发的好地方。从根本上说,它们只是调用一系列程序,这些程序本身可能使用也可能不使用多个内核。
您仍然可以通过在后台运行作业(将&放在命令后面)来实现一定程度的并行性。这允许您的脚本继续执行它想要做的任何事情,同时特定的命令继续在后台运行。之后运行wait命令会强制脚本等待所有后台作业完成后再继续执行。
您还可以将各个命令的PID存储在数组中,并专门等待这些PID。See this answer获取有关如何正确执行此操作的更多详细信息。
对于您的用例,您可以检查可用内核的数量,并在后台/等待那么多进程完成。您可以通过cores /proc/cpuinfo:cat /proc/cpuinfo | grep -c processor检查您有多少个内核
https://stackoverflow.com/questions/49820887
复制相似问题