shell中的多进程【并发】转
来源:互联网 发布:软件专业就业前景 编辑:程序博客网 时间:2024/06/03 19:31
根据我个人的理解,所谓的多进程只不过是将多个任务放到后台执行而已,很多人都用到过,所以现在讲的主要是控制,而不是实现。
先看一个小shell:
看执行结果:
很明显是8s
=============================
这种不占处理器却有很耗时的进程,我们可以通过一种后台运行的方式
来达到节约时间的目的。看如下改进:
用“{}”将主执行程序变为一个块,用&放入后台,四次执行全部放入后台后,我们
需要用一个wait指令,等待所有后台进程执行结束,
不然 系统是不会等待的,直接继续执行后续指令,知道整个程序结束。
看结果:
可以看到,时间已经大大缩短了!
============================
以上实验虽然达到了多线程并发的目的,但有一个缺陷,不能控制
运行在后台的进程数。
为了控制进程,我们引入了管道
无名管道: 就是我们经常使用的 例如: cat text | grep"abc"
有名管道: mkfilo
管道有一个特点,如果管道中没有数据,那么取管道数据的操作就会停滞,直到
管道内进入数据,然后读出后才会终止这一操作,同理,写入管道的操作
如果没有读取操作,这一个动作也会停滞。
当我们试图用echo想管道文件中写入数据时,由于没有任何进程在对它做读取操作,所以
它会一直停留在那里等待读取操作,此时我们在另一终端上用cat指令做读取操作
你会发现读取操作一旦执行,写入操作就可以顺利完成了,同理,先做读取操作也是一样的:
由于没有管道内没有数据,所以读取操作一直滞留在那里等待写入的数据
一旦有了写入的数据,读取操作立刻顺利完成
以上实验,看以看到,仅仅一个管道文件似乎很难实现 我们的目的(控制后台线程数),
所以 接下来介绍 文件操作符,这里只做简单的介绍,如果不熟悉的可以自行查阅资料。
系统运行起始,就相应设备自动绑定到了 三个文件操作符
在
输出到这三个文件的内容都会显示出来。只是因为显示器作为最常用的输出设备而被绑定。
我们可以exec 指令自行定义、绑定文件操作符
文件操作符一般从3-(n-1)都可以随便使用
此处的n 为 ulimit -n 的定义值得
可以看到 我的 n值为1024 ,所以文件操作符只能使用 0-1023,可自行定义的 就只能是 3-1023了。
直接上代码,然后根据代码分析每行代码的含义:
第3行:
第5-7行:
第9-12 行:
第17-24行:
后边的 就不用解释了,贴下执行结果:
每次的停顿中都能看到
一共耗时50s
一共100个任务,每次10个 ,每个5s 正好50s
上边的结果图之所以这么有规律,这是因为我们所执行的100个任务耗时都是相同的,
比如,系统将第一批10个任务放入后台的过程所消耗的时间 几乎可以忽略不计,也就是说
这10个任务几乎可以任务是同时运行,当然也就可以认为是同时结束了,而按照刚才的分析,
一个任务结束时就会向文件描述符写入空行,既然是同时结束的,那么肯定是同时写入的空行,
所以下一批任务又几乎同时运行,如此循环下去的。
实际应用时,肯定不是这个样子的,比如,第一个放到后台执行的任务,是最耗时间的,
那他肯定就会是最后一个执行完毕。
所以,实际上来说,只要有一个任务完成,那么下一个任务就可以被放到后台并发执行了。
补充:
原文地址:http://blog.chinaunix.net/uid-23544240-id-3203378.html
linux shell编程trap命令
trap命令用于指定在接收到信号后将要采取的行动。trap命令的一种常见用途是在脚本程序被中断时完成清理工作。历史上,shell总是用数字来代表信号,而新的脚本程序应该使用信号的名字,它们保存在用#include命令包含进来的signal.h头文件中,在使用信号名时需要省略SIG前缀。你可以在命令提示符下输入命令trap -l来查看信号编号及其关联的名称。
对于那些不熟悉信号的人们来说,“信号”是指那些被异步发送到一个程序的事件。默认情况下,它们通常会终止一个程序的运行。
trap命令的参数分为两部分,前一部分是接收到指定信号时将要采取的行动,后一部分是要处理的信号名。请记住,脚本程序通常是以从上到下的顺序解释执行的,所以必须在你想保护的那部分代码以前指定trap命令。
如果要重置某个信号的处理条件到其默认值,只需简单的将command设置为-。如果要忽略某个信号,就把command设置为空字符串‘’。一个不带参数的trap命令将列出当前设置的信号及其行动的清单。
- shell中的多进程【并发】转
- shell中的多进程【并发】
- shell中的多进程【并发】
- shell中的多进程【并发】
- shell多进程并发控制
- shell中的多进程
- bash shell实现并发多进程操作
- Shell实现多进程并发执行
- Linux Shell实现多进程并发执行
- Linux Shell实现多进程并发执行
- shell中的多进程【并发】http://bbs.51cto.com/thread-1104907-1-1.html
- [Linux]Linux Shell多进程并发以及并发数控制
- shell 脚本中的并发
- Linux Shell实现模拟多进程并发执行
- [Linux]Shell多进程并发—简易版
- [Linux]shell多进程并发—详细版
- linux shell命名管道FIFO(多进程动态并发)
- linux中的shell 进程
- mysql replication 主从…
- mysql 向 mariadb 平滑 过渡
- redis 分布式,主从同步
- Hibernate中一对一,一对多,多对多的写法
- php 实现同一个账号同时只能…
- shell中的多进程【并发】转
- MySQL带参数的存储过程小例子
- hdfs datanode 启动失败
- cURL超时设置
- Curl的毫秒超时的一个”Bug”
- Linux实现端口转发
- PHP5.5四种序列化性能对比
- msgpack---序列化
- set_error_handler() 重要用法