bash命令利用所有CPU资源,通常单线程运行。这意味着所有处理都在单个CPU上执行。随着CPU大小和内核数量的增加,这意味着只有一小部分CPU资源用于处理您的工作。当我们的工作受到CPU处理数据速度的限制时,这些未使用的CPU资源会非常有用。这种情况在多媒体转换(如图片、视频转换)和数据压缩中经常遇到。在本文中,我们将使用并行程序。parallel将列表作为输入,并在所有CPU内核上并行执行命令以处理列表。Parallel甚至会将结果按顺序输出到标准输出,因此它可以在管道中用作其他命令的标准输入。如何使用parallelparallel读取标准输入中的一个列表作为输入,然后创建多个指定的命令进程来处理这个列表,格式为:list|并行命令,其中列表可以由任何常见的bash命令创建,例如:cat、grep、find。这些命令的结果从它们的标准输出通过管道传输到并行的标准输入,如下所示:find。-typef-name"*.log"|parallel类似于在find中使用-exec,parallel使用{}表示输入列表中的每个元素。在下面的示例中,parallel将使用gzip压缩find命令输出的所有文件:find。-typef-name"*.log"|parallelgzip{}以下例子实际使用parallel可能更容易理解。使用并行进行JPEG压缩在本示例中,我收集了一些相对较大的.jpg文件(大小约为10MB),以使用MozJPEG(一种来自Mozilla的JPEG图像压缩工具)进行处理。该工具在尝试保持图像质量的同时减小了JPEG图像的文件大小。这对于减少页面加载时间很重要。下面是一个普通的find命令,用于查找当前目录下的所有.jpg文件,然后通过MozJPEG包中提供的图像压缩工具(cjpeg)进行处理:find。-typef-name"*.jpg"-execcjpeg-outfileLoRes/{}{}';'总共用了0m44.114s。这是运行此命令时top的样子:您可以看到虽然有8个可用内核,但实际上只有一个线程在使用一个内核。让我们并行运行相同的命令:find。-typef-name"*.jpg"|parallelcjpeg-outfileLoRes/{}{}这次压缩所有图像的时间减少到0m10.814s。从顶部显示的差异非常明显:所有CPU内核都在满负荷运行,并且有8个线程使用8个CPU内核。parallelwithgzip如果你需要压缩多个文件而不是一个大文件,那么可以使用parallel来加速这个过程。如果您需要压缩单个文件,同时又想利用所有CPU核心,那么您应该使用pigz,它是gzip的多线程替代品。首先,我用随机数据创建了100个大约1GB的文件:foriin{1..100};做ddif=/dev/urandomof=file-$ibs=1MBcount=10;完成但是我使用find-exec命令来压缩:find.-typef-name"file*"-execgzip{}';'总共耗时0m28.028s,而且只用了单核。切换到并行版本:查找。-typef-name"文件*"|parallelgzip{}花费的时间减少到0m5.774s。parallel是一个很棒的工具,应该添加到您的sysadmin工具包中,并且在正确的地方可以为您节省大量时间。
