之前的文章依赖是1对1或1多对的,但每个任务的前置任务都只有1个。

本文的核心在于一个任务依赖于多个任务的执行完成,如上图所示,这个任务就是fact,只有new和dviduser两个任务都完成的情况下,fact才能继续执行。

init_pipe.sh

# 初始化file descriptor
init_pipe(){
[ -e /tmp/fd1001 ] || mkfifo /tmp/fd1001
exec <>/tmp/fd1001
rm -rf /tmp/fd1001 [ -e /tmp/fd1002 ] || mkfifo /tmp/fd1002
exec <>/tmp/fd1002
rm -rf /tmp/fd1002 [ -e /tmp/fd1003 ] || mkfifo /tmp/fd1003
exec <>/tmp/fd1003
rm -rf /tmp/fd1003 [ -e /tmp/fd1004 ] || mkfifo /tmp/fd1004
exec <>/tmp/fd1004
rm -rf /tmp/fd1004 [ -e /tmp/fd1005 ] || mkfifo /tmp/fd1005
exec <>/tmp/fd1005
rm -rf /tmp/fd1005 [ -e /tmp/fd1006 ] || mkfifo /tmp/fd1006
exec <>/tmp/fd1006
rm -rf /tmp/fd1006 [ -e /tmp/fd1007 ] || mkfifo /tmp/fd1007
exec <>/tmp/fd1007
rm -rf /tmp/fd1007
} destroy_pipe(){
exec <&-
exec >&-
exec <&-
exec >&-
exec <&-
exec >&-
exec <&-
exec >&-
exec >&-
exec <&-
exec <&-
exec >&-
exec >&-
exec <&-
}

work.sh

# 初始化file descriptor

. init_pipe.sh
. sql_lib.sh
################################################################
newFun(){
start_day=$
end_day=$ while [ ${start_day} -le ${end_day} ]
do day=`date +"%Y-%m-%d" -d "${start_day}"` echo "${new_sql//_day_/${day}}"
hive -e "${new_sql//_day_/${day}}"
echo ${start_day} >&
start_day=`date +"%Y%m%d" -d "${start_day} 1 days" `
done
}
################################################################
factFun(){
start_day=$
end_day=$ while [ ${start_day} -le ${end_day} ]
do day=`date +"%Y-%m-%d" -d "${start_day}"` read -u j
read -u k
if [ ${start_day} -le $j -a ${start_day} -le $k ];then
echo "${fact_sql//_day_/${day}}"
hive -e "${fact_sql//_day_/${day}}"
echo ${start_day}>&
echo ${start_day}>&
echo ${start_day}>&
fi
start_day=`date +"%Y%m%d" -d "${start_day} 1 days" `
done
} ################################################################
dvidUserIdFun(){
start_day=$
end_day=$ while [ ${start_day} -le ${end_day} ]
do
day=`date +"%Y-%m-%d" -d "${start_day}"` echo "${dvid_user_id_sql//_day_/${day}}"
hive -e "${dvid_user_id_sql//_day_/${day}}"
echo ${start_day}>&
echo ${start_day}>&
echo ${start_day}>&
start_day=`date +"%Y%m%d" -d "${start_day} 1 days" `
done
} init_pipe newFun "${start}" "${end}" &
factFun "${start}" "${end}" &
dvidUserIdFun "${start}" "${end}" & wait destroy_pipe

shell多线程之进程间通信(3)的更多相关文章

  1. shell多线程之进程间通信(2)

    工作中往往遇到这种情况,有许多任务,依次执行比较浪费时间,由于任务之间有依赖关系,简单的并发执行又不行. 就如同下面这种情况,任务new和dvidUser是可以并发执行的,fact任务依赖于new任务 ...

  2. shell多线程之进程间通信

    # 这是一个简单的并发程序,有如下要求: # .有两个程序a和b,希望他们能并发执行,以节约时间 # .a和b都是按照日期顺序执行,但b每日程序的前提条件是当日a的程序已经执行完毕 #解决方案: # ...

  3. [shell进阶]——shell多线程

    关于shell的多线程 1. 多线程并发执行任务,而不用一台台的串行执行,能更快更高效 2. Shell并没有多线程的概念,所以: * 一般使用wait.read等命令技巧性地模拟多线程实 * 使用命 ...

  4. shell多线程,wait

    文章来源,wait的使用效果还是不错的 最近在使用shell做一些部署工作,在使用过程中,效率一直不高.想提高效率,经过分析发现,并不是所有操作都是需要串行的,一些操作是可以进行并行操作的.经过学习, ...

  5. shell多线程(2)之基于管道实现并发

    在shell脚本里批量执行程序是比较常见的方式,如果程序很多,每个执行时间比较长,则顺序执行需要花费大量的时间. 此时并发就成为我们考虑的方向. 上篇<shell多线程>中我们已经简单实现 ...

  6. linux shell 多线程执行程序

    Shell中并没有真正意义的多线程,要实现多线程可以启动多个后端进程,最大程度利用cpu性能. 直接看代码示例吧. (1) 顺序执行的代码 #!/bin/bash date ` do { echo & ...

  7. Unix/Linux编程实践教程(二:socket、多线程、进程间通信)

    同一接口不同的数据源: 协同进程: fdopen以文件描述符为参数: fopen和popen: 为了实现popen,必须在子进程中调用sh,因为只有shell本身即/bin/sh可以运行任意shell ...

  8. [转]linux shell 多线程实现

    情景 shell脚本的执行效率虽高,但当任务量巨大时仍然需要较长的时间,尤其是需要执行一大批的命令时.因为默认情况下,shell脚本中的命令是串行执行的.如果这些命令相互之间是独立的,则可以使用“并发 ...

  9. shell 命名管道,进程间通信

    命名管道基础 命名管道也被称为FIFO文件, 在文件系统中是可见的,并且跟其它文件一样可以读写! 命名管道特点: 当写进程向管道中写数据的时候,如果没有进程读取这些数据,写进程会堵塞 当读取管道中的数 ...

随机推荐

  1. 如何向数据库添加时同时返回ID

    我们在做项目开发时很多时候都需要数据库的增删改查,而添加数据后又想得到该项数据在数据库中的主键值,这里有一个非常方便的方法可以在插入数据的同时获得主键值. public void save(Perso ...

  2. C++ Lambda表达式基本用法(言简意赅,非常清楚)

    创建一个匿名函数并执行.Objective-C采用的是上尖号^,而C++ 11采用的是配对的方括号[].实例如下: 1 2 3 4 5 6 7 8 9 #include <iostream> ...

  3. TCP 报文段结构

      源端口.目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信.源端口.目标端口是用 ...

  4. IT 达人

    1. 手机与电脑多屏互动 [教程]华为多屏互动功能与PC win7的连接 要求手机和电脑必须在同一局域网内,且手机必须支持多屏互动功能. 操作步骤如下: PC 端: services.msc,启动下面 ...

  5. Codeforces #264 (Div. 2) D. Gargari and Permutations

    Gargari got bored to play with the bishops and now, after solving the problem about them, he is tryi ...

  6. Linux性能测试 sar命令

    sar命令包含在sysstat工具包中,提供系统的众多统计数据.其在不同的系统上命令有些差异 sar 命令行的常用格式: [root@C44 ~]# sar sysstat version (C) S ...

  7. It&#39;s about trust

    所有问题, 最后,它归结为:信任. 你能相信别人? 我不是Low esteem.相反,我有信心.问题是.我有一个别人缺乏信任的. Daria家长们说,伪君子:我们必须相信你. Daria马上问:然后, ...

  8. 首个 C++ 编译器诞生 30 周年了,来听听 C++ 之父畅谈 C++

    原文  http://www.iteye.com/news/31076   C++ 之父 Bjarne Stroustrup 在 cfront 诞生 30 周年的访谈. 整整30年前,CFront 1 ...

  9. 对复杂字典Dictionary<T1,T2>排序问题

    原文:对复杂字典Dictionary<T1,T2>排序问题 //VoltageCount类(电压值对应的数量):    public class VoltageCount    {     ...

  10. 【msdn wpf forum翻译】TextBlock等类型的默认样式(implicit style)为何有时不起作用?

    原文:[msdn wpf forum翻译]TextBlock等类型的默认样式(implicit style)为何有时不起作用? 原文链接:http://social.msdn.microsoft.co ...