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. 将变量作为参数传给函数,代码如下
##### 解决办法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
  1. 使用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的一个小坑相关推荐

  1. [LeetCode]29 两数相除和一个小坑点

    给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符.返回被除数 dividend 除以除数 divisor 得到的商.示例 1:输入: ...

  2. mysql内核测试,MySQL 5.7内核复制中的一个小坑

    问题背景 最近在写一个作为MySQL Slave的角色的程序,连接到MySQL Master使用MySQL复制协议来Dump Binlog事件流.很自然,这个程序在第一次运行的时候,其事务GTIDSe ...

  3. golang原生库mime/multipart上传formdata文件的一个小坑unexpected EOF

    golang原生库mime/multipart上传formdata文件的一个小坑unexpected EOF 遇到的问题 问题代码 问题分析 正确代码 总结 遇到的问题 用mime/multipart ...

  4. c 语言for 循环大到小,C语言中for循环问题(一个小坑需注意)

    今天分享一下C语言中的for循环中我们常常忽略的小问题. 举一个小例子来说明,大家也可以自己先算一下哦 #define _CRT_SECURE_NO_WARNINGS #include #includ ...

  5. Rocksdb Slice使用中的一个小坑

    本文记录一下使用Rocksdb Slice过程中的一个小小坑,差点没一口老血吐出来. rocksdb的Slice 数据结构是一个小型得不可变类string数据结构,设计出来的目的是为了保证rocksd ...

  6. 关于laravel 框架运行数据库迁移文件的一个小坑以及常用php artisan命令

    小白我因为最近开发的一系列项目都是用的laravel框架,所以为了方便有时候就会直接复制一份代码以此作为新项目的基础.可能因为"因为夜路走多了,所以掉坑里了">>> ...

  7. 关于idea Tomcat部署的一个小坑

    最近fork了一个开源管理系统,在idea上部署的时候遇到了点小问题,印象中之前好像也遇到过,今天把问题Mark在CSDN上. idea–>Run–>Edit Configurations ...

  8. Python创建二维数组(关于list的一个小坑)

    0.目录 1.遇到的问题 2.创建二维数组的办法 3.1 直接创建法 3.2 列表生成式法 3.3 使用模块numpy创建 1.遇到的问题 今天写Python代码的时候遇到了一个大坑,差点就耽误我交作 ...

  9. Asp-Net-Core开发笔记:在docker部署时遇到一个小坑

    哦吼 之前刚说了尝试了使用docker来部署AspNetCore应用(Asp.Net Core部署:早知道,还是docker!以及一点碎碎念),结果这才刚上班就遇到问题了= =- 我这项目用的数据库是 ...

最新文章

  1. 畅想下计算机/计算型设备的未来
  2. 实战SSM_O2O商铺_04自下而上逐步整合SSM
  3. java 线程可见性,Java多线程之内存可见性
  4. 整洁架构之道--三种经典的编程范式
  5. 51nod1363 最小公倍数之和
  6. OFFICE EXCEL表格中让A1 中的数字为变量时,如何引用
  7. Ubuntu下apache配置文件路径
  8. 多继承完美闪避成员名冲突的问题
  9. 算法:Valid Parentheses(有效的括号)
  10. python下载图片代码_基于Python下载网络图片方法汇总代码实例
  11. 梯度提升(Gradient Boosting)算法
  12. java clh_【Java并发编程实战】----- AQS(四):CLH同步队列
  13. 计算机关机重启后黑屏,电脑重启黑屏强制关机后才能开怎么办
  14. 欧盟 GDPR 通用数据保护条例正式生效后,各行业影响分析
  15. 用vue写一个计算总价
  16. 罗素问题 ——来自知乎大神
  17. python网络编程能用来做什么_python网络编程是什么意思
  18. SCSI协议及大容量存储命令详解
  19. 命令行运行Unity脚本
  20. oracle数据块损坏后的修复方法

热门文章

  1. S7COMM协议分析
  2. Spring+SpringMVC+Hibernate实现投票/调查问卷网站
  3. 中国境外三个不为人知的汉人政权
  4. 鸿蒙5G的营业执照,华为继“鸿蒙”商标后注册“5G”商标
  5. 数据管理解决方案 | 零售行业如何搭建全渠道大数据平台?
  6. sql中以sa命名的用户名无法使用,错误码1845
  7. 准备好迎接你的“新同事”了吗?他叫人工智能 | 精选
  8. 一个无名前端的10年前端路
  9. 【NRF51822】百度手环开源源码分析--底层通讯部分
  10. Android 音频(Audio)架构