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=$1
	compare_result=$(echo "$my_value > $max_num" | bc)
    # echo $compare_result
    if [[ $compare_result == 0 ]]; then
        echo "less than"
    else
        echo "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=$1
    max_num=$2
	compare_result=$(echo "$my_value > $max_num" | bc)
    # echo $compare_result
    if [[ $compare_result == 0 ]]; then
        echo "less than"
    else
        echo "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=$1
	compare_result=$(echo "$my_value > $max_num" | bc)
    # echo $compare_result
    if [[ $compare_result == 0 ]]; then
        echo "less than"
    else
        echo "greater than"
    fi
}
export -f compare_value 
export max_num=3
echo -e "2\n4" | parallel -j 2 compare_value {}

以上两种方式都可以解决报错,可以根据实际需求选择哪一个。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值