在bash或脚本中,如何并行执行命令或任务(命令行、parallel、make)

最近要批量解压归档文件和压缩包,所以就想能不能并行执行这些工作。因为tar自身不支持并行解压,但是像make却可以支持生成一些文件,所以我才有了这种想法。

方法有两种,第一种不用安装任何软件或工具,直接bash或其他 Shell 中就可以使用;第二种需要安装 GNU parallel 这个工具来进行。二者在使用上都很简单,但是后者更人性化(应该可以用这个词来形容)一些。最后还介绍了一种比较奇特的方法,是无意中看到的,虽然没啥用但是有点意思。

直接在命令最后使用&

这个方法需要在命令最后使用&,也就是将这个命令放入后台执行。如下是并行解压提取当前文件夹下所有的归档文件的方法:

for tarfile in *.tar; do 
	tar xvf $tarfile &
done;

可以看到这个方法可以说是非常简单了,但是最大的问题就是它会给每个归档文件创建一个进程,并不会自动根据设备的线程数而创建合适数量的进程(tar由于需要大量 I/O,所以也无法维持高 CPU 使用率),如下:

请添加图片描述

如果是小数量的解压提取可能没什么问题,但是如果特别大数量的归档文件解压提取,那么可能会造成调度损耗过大。如果需要根据实际线程数量生成,那么就复杂多了。

使用GNU parallel

这个工具很好用,不光可以设置最大并行任务数量,还可以通过--bar选项显示当前总进度如何。使用方法如下(还是解压提取一堆归档文件):

parallel tar xvf ::: *.tar

这种方法但是像time,将需要并行化的命令放到parallel后面即可,而不同命令之间不同的地方(参数部分)使用:::标注出来。

而且相比上一种方法,默认情况下最多只会创建 CPU 的线程数的进程,而不是一次性全部生成。如下:

请添加图片描述

可以看到一开始只生成了线程数量的进程,也就是8个进程。如果想手动设定最大并行进程数量,那么使用-j 数量即可(make-j选项一样,有没有空格都行)。

管道传递参数

上面是直接可以获取参数的情况,并不存在不同程序之间通过管道(pipe)传递信息的情况。那么面对这种情况该怎么办呢?

使用{}在下一个程序的参数部分,作为即将传递的参数字符串的占位符,而且parallel也要使用在下一个程序前面。需要注意的是:传递的参数是分散开传递的。比如说一个多行字符串"1234\n1234\n1234"会被传递成三个单行字符串"1234","1234","1234"

假设一个文本文件中,每一行都是一个地址,我们想并行下载所有链接的文件,那么可以使用:

cat abc.txt | parallel wget {}

但是面对比如说使用grep批量查询abc.txt中含有abc的行有哪些,如果还使用上面这样的传递,由于是分散开传递的,那么这个单独的字符串会被当作文件名:

cat abc.txt | parallel grep abc {}

结果如下:

$ cat abc.txt | parallel grep abc {}
grep: bfjksa: No such file or directory
grep: afhjha,fsj: No such file or directory
grep: abcshjagf: No such file or directory
grep: a;hfahabc: No such file or directory
grep: ahsfhmabc: No such file or directory

在这种就不要使用并行化,因为读取硬盘上的文件实际上是串行的,对单个或多个文件使用并行读取或写入几乎不会有任何性能提升,有时甚至还会降低(跳来跳去比顺序读取当然慢了)。

比如说官方有个例子是查找当前目录下所有文件中含有某一字符串的行,这里我查找main这个字符串:

$ time find . -type f | parallel grep -H -n main {}
./mem_disk_speedtest_in_C/.git/config:10:[branch "main"]
...

real    0m26.651s
user    0m3.351s
sys     0m1.030s

而不使用 GNU Parallel 的命令为(并不是直接删除parallel部分就行了,需要做出一些调整):

$ time grep -H -n main $(find . -type f)
./mem_disk_speedtest_in_C/.git/config:10:[branch "main"]
...

real    0m22.247s
user    0m3.204s
sys     0m0.809s

可以看到慢了 18%。这是比较坏的情况,一般情况下,用不用 GNU Parallel 速度都没什么变化。

更多选项请见官方文档:GNU Parallel Tutorial

二者的速度区别

实际测试上,直接在命令最后使用&要比使用GNU parallel慢一些(应该就是因为调度损耗了一部份性能),如下:

方法运行时间(秒)
串行237.9
&152.1
GNU parallel121.3

但是由于这里使用的 CPU 缓存较少,所以解压速度也没有 8 倍的提升,但是提升一倍也是不错的了。

扩展

正如开头所说,make是可以并行生成一些文件,而且可以通过-j选项设置最大并行任务数量。我们也可以利用这点来解压提取文件,但这并不是一个正经的办法,仅限于开拓眼界,因为有点“脱裤子放屁”的感觉(因为生成Makefile中的target部分需要使用CMake或者Bash来自动生成),正经使用的时候还是不要使用这种方法。

这个方法是我在 Running commands in parallel with a limit of simultaneous number of commands - superuser 中看到的,进行了一些尝试,可以说除了奇特毫无优点(通用性比不过&,易用性比不过 GNU Parallel),所以不推荐使用。

参考资料

Parallelize a Bash FOR Loop - Unix StackExchange

Can I use pipe output as a shell script argument? - superuser stackexchange

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/364233.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年大数据方向的发展趋势

最近事情较多,因为临近年底,在做总结和后续规划,在这一年中,数据开发方向仍然在快速发展,新概念和新技术层出不穷。 并且2023年是各大公司新技术大规模落地的一年,相比2022年及以前空中楼阁似的讨论和不接地…

qt学习:停车场管理系统+摄像头+http识别车牌+sqlite3数据库

目录 参考前面发的几篇文章http识别车牌,sqlite3数据库、摄像头的文章 步骤 部分代码 新建一个项目,加入前面用到的http和image两个文件,和加入用到的模块和头函数和成员,加入前面用到的全局变量 配置ui界面 在构造函数中初…

Tomcat 部署项目时 war 和 war exploded区别

在 Tomcat 调试部署的时候,我们通常会看到有下面 2 个选项。 是选择war还是war exploded 这里首先看一下他们两个的区别: war 模式:将WEB工程以包的形式上传到服务器 ;war exploded 模式:将WEB工程以当前文件夹的位置…

Linux下Docker搭建部署Typecho博客【详细版】

Linux下Docker搭建部署Typecho博客【详细版】 一、环境准备1.1.准备阿里云服务器【新用户免费使用三个月】1.2.准备远程工具【FinalShell】1.3.系统信息1.4.安装所需软件包1.5.设置docker镜像源1.6.更新yum软件包索引1.7.确认停用selinux 二、安装Docker2.1.安装Docker-Ce2.2.查…

智能预测:数字化时代的服装企业如何实现准确的需求规划

在数字化时代,智能预测成为服装企业实现准确需求规划的关键。通过充分利用先进的技术手段,企业能够更精准地洞察市场动态、了解消费者行为,从而使生产计划更加敏捷、高效。以下是数字化时代服装企业实现准确需求规划的关键步骤和策略。 1.数…

探索组合模式的魅力:探索树形结构的艺术与科学

设计模式专栏:http://t.csdnimg.cn/nolNS 在面对层次结构和树状数据结构的软件设计任务时,我们如何优雅地处理单个对象与组合对象的一致性问题?组合模式(Composite Pattern)为此提供了一种简洁高效的解决方案。通过本…

InfluxDB数据的导入导出

Background influxdb支持将时序数据导出到文件,然后再将文件导入到数据库中,以此实现数据的迁移。 1、数据导出 语法: 示例: influx_inspect export -datadir "/var/lib/influxdb/data" -waldir "/var/lib/influ…

kubekey网页版安装k8s集群操作流程

kubekey可以一键拉起k8s集群并完成kubesphere的部署,以后kubekey简称kk。kk 3.2版本以前都是在宿主机上完成对应的创建集群、添加节点、升级等操作的,3.2版本后开始往页面操作的方向演进,kk 3.2版本现在还是alpha,所以不推荐在生产…

flowable 设置自定义属性教程

概述 由于工作需要给flowable工作流设计器添加自定义属性,以满足功能实现。所以这篇文章介绍下用flowable 开源的的flowable-ui 前端添加自定义属性,后端解析属性值的例子。 技术栈 序号技术点名称版本1Flowable6.8.0 使用的是flowable6.8.0 版的代码…

Flink 1.18.1的基本使用

系统示例应用 /usr/local/flink-1.18.1/bin/flink run /usr/local/flies/streaming/SocketWindowWordCount.jar --port 9010nc -l 9010 asd asd sdfsf sdf sdfsdagd sdf单次统计示例工程 cd C:\Dev\IdeaProjectsmvn archetype:generate -DarchetypeGroupIdorg.apache.flink -…

单元测试实践

一、写在开始写单元测试前 1.1 背景 我们开发都知道单元测试的重要性,而且每个开发都有要写单元测试的意识单元测试和代码编写结构息息相关,业界常用专业名词TDD(测试驱动开发),言外之意我们开始编写代码的时候就已经…

开发板——X210开发板的SD卡启动方式

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 参考博客: S5PV210 SD卡启动 - 简书 关于存储器的相关基础知识,见博文: 外存——SD卡/iNand芯片与S5PV210的SD/MMC/iNand控制器-CSDN博客 RAM、ROM和FLASH三…

Qt6入门教程 15:QRadioButton

目录 一.简介 二.常用接口 三.实战演练 1.径向渐变 2.QSS贴图 3.开关效果 4.非互斥 一.简介 QRadioButton控件提供了一个带有文本标签的单选按钮。 QRadioButton是一个可以切换选中(checked)或未选中(unchecked)状态的选项…

Flink 流式读取 Debezium CDC 数据写入 Hudi 表无法处理 -D / Delete 消息

问题场景是:使用 Kafka Connect 的 Debezium MySQL Source Connector 将 MySQL 的 CDC 数据 (Avro 格式)接入到 Kafka 之后,通过 Flink 读取并解析这些 CDC 数据,然后以流式方式写入到 Hudi 表中,测试中发现…

Java Springboot解决很多页面Whitelabel Error Page(404)问题

前言 最近接手了一个前后端一体的项目,发现其默认路径不是主机端口(如:http://localhost:3453/)的形式。很多页面的访问是加了一个层级。只要访问就会出现如下提示: Whitelabel Error Page This application has no …

双目相机立体匹配基础

双目匹配就是用左相机和右相机去拍摄同一个点,目的是找到三维世界的同一个点,也就是在左相机和右相机中的成像点之间的像素差(视差),根据视差去求解深度,那么找到左相机点到右相机的同一个对应点这个过程就…

草图导入3d后模型贴材质的步骤?---模大狮模型网

3D模型在导入草图大师后出现混乱可能有多种原因,以下是一些可能的原因和解决方法: 模型尺寸问题:如果3D模型的尺寸在导入草图大师时与画布尺寸不匹配,可能导致模型混乱。解决方法是在3D建模软件中调整模型的尺寸,使其适…

【NodeJS】005- MongoDB数据库

1.简介 1.1 Mongodb 是什么 MongoDB 是一个基于分布式文件存储的数据库,官方地址 https://www.mongodb.com/ 1.2 数据库是什么 数据库(DataBase)是按照数据结构来组织、存储和管理数据的 应用程序 1.3 数据库的作用 数据库的主要作用就是…

目标检测:1预备知识

开始涉及目标检测内容,总结一下学习记录 1、目标检测的基本概念 (一)什么是目标检测 目标检测(Object Detection) 的任务是找出图像中所有感兴趣的目标(物体),不同于分类和回归问题…

react-virtualized实现行元素不等高的虚拟列表滚动

前言: 当一个页面中需要接受接口返回的全部数据进行页面渲染时间,如果数据量比较庞大,前端在渲染dom的过程中需要花费时间,造成页面经常出现卡顿现象。 需求:通过虚拟加载,优化页面渲染速度 优点&#xff1…