`

Linux Shell实现多进程并发执行

 
阅读更多

转载自:http://hi.baidu.com/felixzhu84/blog/item/43b746c9ac6985027e3e6fe7.html

 

在bash中,使用后台任务来实现任务的“多进程化”。在不加控制的模式下,不管有多少任务,全部都后台执行。也就是说,在这种情况下,有多少任务就有多少“进程”在同时执行。我们就先实现第一种情况:

实例一:正常情况脚本

———————————————————————————–

#!/bin/bash

for ((i=0;i<5;i++));do
{
sleep 1;echo 1>>aa && echo ”done!”
 }
done
cat aa|wc -l
rm aa

———————————————————————————–

这种情况下,程序顺序执行,每个循环3s,共需15s左右。

$ time bash test.sh
done!
done!
done!
done!
done!
5

real    0m15.030s
user    0m0.002s
sys     0m0.003s

实例二:“多进程”实现

———————————————————————————–

#!/bin/bash

for ((i=0;i<5;i++));do
 {
 sleep 3;echo 1>>aa && echo ”done!”
 } &
done
wait
cat aa|wc -l
rm aa

———————————————————————————–

这个实例实际上就在上面基础上多加了一个后台执行&符号,此时应该是5个循环任务并发执行,最后需要3s左右时间。

$ time bash test.sh
done!
done!
done!
done!
done!
5

   real    0m3.011s
user    0m0.002s
sys     0m0.004s

效果非常明显。

这里需要说明一下wait的左右。wait是等待前面的后台任务全部完成才往下执行,否则程序本身是不会等待的,这样对后面依赖前面任务结果的命令来说就可能出错。例如上面wc -l的命令就报错:不存在aa这个文件。

以上所讲的实例都是进程数目不可控制的情况,下面描述如何准确控制并发的进程数目。

——————————————————————————————————————

#!/bin/bash
# 2006-7-12, by wwy
#———————————————————————————–
# 此例子说明了一种用wait、read命令模拟多线程的一种技巧
# 此技巧往往用于多主机检查,比如ssh登录、ping等等这种单进程比较慢而不耗费cpu的情况
# 还说明了多线程的控制
#———————————————————————————–


function a_sub { # 此处定义一个函数,作为一个线程(子进程)
sleep 3 # 线程的作用是sleep 3s
}


tmp_fifofile=”/tmp/$.fifo”
mkfifo $tmp_fifofile          # 新建一个fifo类型的文件
exec 6<>$tmp_fifofile      # 将fd6指向fifo类型
rm $tmp_fifofile


thread=15 # 此处定义线程数
for ((i=0;i<$thread;i++));do
echo
done >&6 # 事实上就是在fd6中放置了$thread个回车符


for ((i=0;i<50;i++));do # 50次循环,可以理解为50个主机,或其他

read -u6
# 一个read -u6命令执行一次,就从fd6中减去一个回车符,然后向下执行,
# fd6中没有回车符的时候,就停在这了,从而实现了线程数量控制

{ # 此处子进程开始执行,被放到后台
 a_sub && { # 此处可以用来判断子进程的逻辑
 echo ”a_sub is finished”
 } || {
 echo ”sub error”
 }
 echo >&6 # 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个
} &

done

wait # 等待所有的后台子进程结束
exec 6>&- # 关闭df6


exit 0
——————————————————————————————————————

sleep 3s,线程数为15,一共循环50次,所以,此脚本一共的执行时间大约为12秒

即:
15×3=45, 所以 3 x 3s = 9s
(50-45=5)<15, 所以 1 x 3s = 3s
所以 9s + 3s = 12s

$ time ./multithread.sh >/dev/null

real        0m12.025s
user        0m0.020s
sys         0m0.064s

而当不使用多线程技巧的时候,执行时间为:50 x 3s = 150s。

此程序中的命令 mkfifo tmpfile和linux中的命令 mknod tmpfile p效果相同。

区别是mkfifo为POSIX标准,因此推荐使用它。该命令创建了一个先入先出的管道文件,并为其分配文件标志符6。管道文件是进程之间通信的一种方式,注意这一句很重要

exec 6<>$tmp_fifofile      # 将fd6指向fifo类型

如果没有这句,在向文件$tmp_fifofile或者&6写入数据时,程序会被阻塞,直到有read读出了管道文件中的数据为止。而执行了上面这一句后就可以在程序运行期间不断向fifo类型的文件写入数据而不会阻塞,并且数据会被保存下来以供read程序读出

 

 

SHELL模拟多线程脚本的详细注解

http://findingcc.blog.51cto.com/1045158/287417

 

 

分享到:
评论

相关推荐

    Linux脚本实现多进程并发执行、杀死脚本操作

    本教程将深入探讨如何使用Linux脚本来实现多进程并发执行以及如何优雅地终止这些进程。我们将主要关注bash脚本,因为它是最常用且广泛支持的Linux shell。 首先,让我们了解一下多进程的概念。在计算机科学中,进程...

    操作系统(第四讲课后作业(Linux Shell实现模拟多进程并发执行的思考报告).docx

    在多进程并发执行中,操作系统通过时间片分配机制来实现对CPU资源的有效利用。这意味着每个进程只能获得有限的CPU时间,然后必须将CPU让给其他进程,这个过程不断循环,直到所有进程都执行完毕或达到某种终止条件。 ...

    linux测试使用shell并发脚本

    "Linux测试使用Shell并发脚本"这个主题涉及到的是如何利用Shell脚本来实现多任务并行执行,提高工作效率。在实际工作中,这样的脚本对于进行性能测试、自动化测试等场景尤其有用。 首先,我们来理解一下Shell脚本的...

    linux shell角本编程PPT 打包

    4. **进程管理和并发**:使用`&`、`wait`、`jobs`命令进行后台执行和进程控制。 5. **脚本权限和执行**:理解`chmod`命令和执行权限,以及如何安全地分发脚本。 通过学习这些内容,你将能够编写出高效、可靠的Shell...

    shell的多线程&当前文件夹下批量插入MySQL

    在IT领域,Shell脚本是一种常用的自动化工具,用于在Linux或Unix系统中执行一系列命令。虽然Shell本身并不支持真正的多线程,但可以通过巧妙的方法模拟多线程的行为,以提高处理任务的效率。本文将详细讲解如何在...

    shell脚本实现多进程运行的方法示例

    在Linux或Unix环境中,Shell脚本是自动化任务的强大工具,而多进程运行是提升脚本并行处理能力的关键。本文将深入探讨如何在Shell脚本中实现多进程运行,并通过具体的示例进行详细讲解。 首先,我们要理解多进程的...

    Linux C 简单Shell 的实现

    本项目是基于C语言实现的一个简单Shell,它提供了基本的命令行交互功能,包括`cd`、`ls`、`echo`、`quit`、`env`、`jobs`以及批处理和后台并发执行。下面我们将详细讨论这些知识点。 1. **Shell程序基础**: - ...

    shell脚本多进程ping多个ip

    在这个场景下,我们关注的是一个shell脚本,它能够实现多进程同时ping多个IP地址,并且能够控制ping结果的日志路径和日志文件大小。这在监控网络连通性、故障排查或者性能测试时非常有用。 首先,让我们深入理解...

    数据库系统概念_中文第六版+Linux Shell编程从入门到精通.张昊

    Shell脚本能够自动化执行一系列命令,提高工作效率。从入门到精通的学习路径通常包括基础语法、条件语句、循环结构、函数定义、文件处理、进程控制以及高级特性如正则表达式和Awk/Sed工具的使用。通过熟练掌握Shell...

    操作系统课程设计进程并发

    操作系统课程设计中的进程并发是一个重要的学习主题,它涵盖了操作系统如何管理和调度多个同时运行的程序,以实现系统的高效利用。在本课程设计中,学生将深入理解进程的基本概念、创建、同步与通信,以及死锁等问题...

    Shell 脚本实现多线程的代码

    在IT领域,Shell脚本是Linux/Unix系统中常用的一种自动化任务执行工具。它基于Bash或其他Shell环境,能够编写一系列命令,实现批量处理、定时任务等。在标题"Shell 脚本实现多线程的代码"中,我们关注的重点是如何在...

    php多线程并发实现方法

    每次有请求进入,PHP都会启动一个新的进程来处理这个请求,因此它更像是支持多进程并发模型。但是,可以通过特定的技巧来模拟多线程的行为。 在Apache服务器上,PHP脚本通常运行在一个有限的子进程中,并且对多线程...

    Linux环境下进程管理.doc

    在这种情况下,由于`printf()`函数会连续输出整个字符串,因此尽管进程并发执行,但每个进程内部的字符串输出顺序保持不变。但由于进程调度的不确定性,不同进程间的输出顺序可能会变化。 进一步,实验引入了`lockf...

    linux-shell编程

    这些特性让Shell脚本能够处理更复杂的情况,如并发执行任务和跨进程通信。 最后,第五部分可能会探讨一些实际应用案例,比如系统备份脚本、日志分析脚本,或者自动化的部署流程。通过这些实例,读者可以学习到如何...

    Shell脚本实现把进程负载均衡到多核CPU中

    ### Shell脚本实现进程负载均衡至多核CPU 随着现代计算设备硬件能力的不断提升,多核处理器已经成为标准配置。为了充分利用这些多核处理器的能力,合理地分配进程到不同的CPU核心上变得尤为重要。本文将详细介绍...

    Linux并发执行很简单,这么做就对了

    这可以通过多进程(每个任务作为一个独立的进程)或多线程(一个进程中可以有多个线程同时执行任务)来实现。这里提到的是基于命令行工具的简单并发,主要利用shell脚本中的`for`循环和`xargs`命令。 2. **`for`...

    Go-仿Linuxshell命令的邮箱命令行客户端

    Linux shell是操作系统提供的一个命令解释器,用户通过输入命令来执行操作,如文件管理、进程控制等。仿Linux shell命令的邮箱客户端,意味着它会提供相似的命令语法,让用户可以像操作文件系统一样操作邮箱,比如...

    一种限制shell脚本并行执行的方法

    本发明公开了一种限制shell...概念,利用linux 的管道,实现并行执行的多个进 程进入临界区时的“串行化”,利用单独的死锁检 测脚本,来检测死锁,没有多个并发进程对同一个 令牌进行操作,可以有效地解决死锁的问题。

    PHP+shell实现多线程的方法

    本文介绍了一种结合shell脚本来实现PHP多线程的方法,这在处理一些需要并发执行的任务时非常有用,比如批量数据处理、文件下载等。 首先,我们来看一个简单的PHP脚本(test.php): ```php for ($i = 0; $i ; $i+...

    Linux与unix shell编程指南

    ### Linux与Unix Shell编程之内核同步技术详解 #### 一、引言 在Linux操作系统中,内核作为操作系统的核心部分,负责管理系统的资源以及协调各个应用程序之间的交互。随着多核处理器的普及,如何有效地管理和同步...

Global site tag (gtag.js) - Google Analytics