parallel的一个小坑
parallel介绍
parallel是一个很好用的linux并行软件,与linux自带的xargs功能类似,但比它更好用,关于parallel的安装及具体用法可以参考该文章:15分钟神器gnu parallel 入门观止 ,这里介绍一个使用parallel时需要注意的小坑。
一个小坑
paralle并行的本质是开启了多个进程,也就是多个shell,每个shell单独去执行任务,由parallel来控制这些进程。那么这里就存在一个问题,即父shell定义的变量不会传给parallel开启的子shell,子shell里面这些变量是空的,因此在子shell中使用这些变量的时候就会报错,如果将变量传给bc去计算数值,则会报(standard_in) 2: syntax error
,这个报错极其隐晦,让人看不出原因是什么,但真实原因是传给bc的变量是空的,一个简单复现这个报错的例子如下:
$ a=1
$ b=
$ echo $b
$ echo "$a > $b" | bc
(standard_in) 2: syntax error
使用parallel时一般都会定义一个函数,这个函数用来处理输入数据,如果用户在函数外面定义了一些函数里面需要使用的变量,那么函数里面是找不到这些变量的,如果将这些变量传给bc去计算,就会报上面的错误,一个示例代码如下:
max_num=3
function compare_value(){my_value=$1compare_result=$(echo "$my_value > $max_num" | bc)# echo $compare_resultif [[ $compare_result == 0 ]]; thenecho "less than"elseecho "greater than"fi
}# 普通执行
compare_value 2
compare_value 4
# 输出结果
# less than
# greater than# paralle并行执行
export -f compare_value
echo -e "2\n4" | parallel -j 2 compare_value {}
# 输出结果
# greater than
# (standard_in) 2: syntax error
# greater than
# (standard_in) 2: syntax error
可以看到使用parallel的时候出现了syntax error
错误,并且还输出了greater than
,这是因为compare_result
是空的,在if
判断的时候就会执行else
语句,因此输出了greater than
。
在这个例子中,max_num是在脚本中定义的变量,只在当前shell有效,parallel会开启子shell,而子shell中max_num是空的,因此就会报错,解决办法有两个:
- 将变量作为参数传给函数,代码如下
##### 解决办法1
function compare_value(){my_value=$1max_num=$2compare_result=$(echo "$my_value > $max_num" | bc)# echo $compare_resultif [[ $compare_result == 0 ]]; thenecho "less than"elseecho "greater than"fi
}
export -f compare_value
max_num=3
echo -e "2\n4" | parallel -j 2 compare_value {} $max_num
- 使用
export
将变量变成环境变量
##### 解决办法2
function compare_value(){my_value=$1compare_result=$(echo "$my_value > $max_num" | bc)# echo $compare_resultif [[ $compare_result == 0 ]]; thenecho "less than"elseecho "greater than"fi
}
export -f compare_value
export max_num=3
echo -e "2\n4" | parallel -j 2 compare_value {}
以上两种方式都可以解决报错,可以根据实际需求选择哪一个。
parallel的一个小坑相关推荐
- [LeetCode]29 两数相除和一个小坑点
给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符.返回被除数 dividend 除以除数 divisor 得到的商.示例 1:输入: ...
- mysql内核测试,MySQL 5.7内核复制中的一个小坑
问题背景 最近在写一个作为MySQL Slave的角色的程序,连接到MySQL Master使用MySQL复制协议来Dump Binlog事件流.很自然,这个程序在第一次运行的时候,其事务GTIDSe ...
- golang原生库mime/multipart上传formdata文件的一个小坑unexpected EOF
golang原生库mime/multipart上传formdata文件的一个小坑unexpected EOF 遇到的问题 问题代码 问题分析 正确代码 总结 遇到的问题 用mime/multipart ...
- c 语言for 循环大到小,C语言中for循环问题(一个小坑需注意)
今天分享一下C语言中的for循环中我们常常忽略的小问题. 举一个小例子来说明,大家也可以自己先算一下哦 #define _CRT_SECURE_NO_WARNINGS #include #includ ...
- Rocksdb Slice使用中的一个小坑
本文记录一下使用Rocksdb Slice过程中的一个小小坑,差点没一口老血吐出来. rocksdb的Slice 数据结构是一个小型得不可变类string数据结构,设计出来的目的是为了保证rocksd ...
- 关于laravel 框架运行数据库迁移文件的一个小坑以及常用php artisan命令
小白我因为最近开发的一系列项目都是用的laravel框架,所以为了方便有时候就会直接复制一份代码以此作为新项目的基础.可能因为"因为夜路走多了,所以掉坑里了">>> ...
- 关于idea Tomcat部署的一个小坑
最近fork了一个开源管理系统,在idea上部署的时候遇到了点小问题,印象中之前好像也遇到过,今天把问题Mark在CSDN上. idea–>Run–>Edit Configurations ...
- Python创建二维数组(关于list的一个小坑)
0.目录 1.遇到的问题 2.创建二维数组的办法 3.1 直接创建法 3.2 列表生成式法 3.3 使用模块numpy创建 1.遇到的问题 今天写Python代码的时候遇到了一个大坑,差点就耽误我交作 ...
- Asp-Net-Core开发笔记:在docker部署时遇到一个小坑
哦吼 之前刚说了尝试了使用docker来部署AspNetCore应用(Asp.Net Core部署:早知道,还是docker!以及一点碎碎念),结果这才刚上班就遇到问题了= =- 我这项目用的数据库是 ...
最新文章
- 畅想下计算机/计算型设备的未来
- 实战SSM_O2O商铺_04自下而上逐步整合SSM
- java 线程可见性,Java多线程之内存可见性
- 整洁架构之道--三种经典的编程范式
- 51nod1363 最小公倍数之和
- OFFICE EXCEL表格中让A1 中的数字为变量时,如何引用
- Ubuntu下apache配置文件路径
- 多继承完美闪避成员名冲突的问题
- 算法:Valid Parentheses(有效的括号)
- python下载图片代码_基于Python下载网络图片方法汇总代码实例
- 梯度提升(Gradient Boosting)算法
- java clh_【Java并发编程实战】----- AQS(四):CLH同步队列
- 计算机关机重启后黑屏,电脑重启黑屏强制关机后才能开怎么办
- 欧盟 GDPR 通用数据保护条例正式生效后,各行业影响分析
- 用vue写一个计算总价
- 罗素问题 ——来自知乎大神
- python网络编程能用来做什么_python网络编程是什么意思
- SCSI协议及大容量存储命令详解
- 命令行运行Unity脚本
- oracle数据块损坏后的修复方法
热门文章
- S7COMM协议分析
- Spring+SpringMVC+Hibernate实现投票/调查问卷网站
- 中国境外三个不为人知的汉人政权
- 鸿蒙5G的营业执照,华为继“鸿蒙”商标后注册“5G”商标
- 数据管理解决方案 | 零售行业如何搭建全渠道大数据平台?
- sql中以sa命名的用户名无法使用,错误码1845
- 准备好迎接你的“新同事”了吗?他叫人工智能 | 精选
- 一个无名前端的10年前端路
- 【NRF51822】百度手环开源源码分析--底层通讯部分
- Android 音频(Audio)架构