热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linuxshell多进程通信,LinuxShell实现多进程并发执行

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

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

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

实例一:正常情况脚本#!/bin/bash

for ((i&#61;0;i<5;i&#43;&#43;));do

{

sleep 1;echo 1》aa && echo ”done!”

}

done

cat aa|wc -l

rm aa

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

$ time bash test.sh

done!

done!

done!

done!

done!

5

real    0m15.030s

user    0m0.002s

sys     0m0.003s

实例二&#xff1a;“多进程”实现#!/bin/bash

for ((i&#61;0;i<5;i&#43;&#43;));do

{

sleep 3;echo 1》aa && echo ”done!”

} &

done

wait

cat aa|wc -l

rm aa

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

$ time bash test.sh

done!

done!

done!

done!

done!

5

real    0m3.011s

user    0m0.002s

sys     0m0.004s

效果非常明显。

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

以上所讲的实例都是进程数目不可控制的情况&#xff0c;下面描述如何准确控制并发的进程数目。#!/bin/bash

# 2006-7-12, by wwy

#———————————————————————————–

# 此例子说明了一种用wait、read命令模拟多线程的一种技巧

# 此技巧往往用于多主机检查&#xff0c;比如ssh登录、ping等等这种单进程比较慢而不耗费cpu的情况

# 还说明了多线程的控制

#———————————————————————————–

function a_sub { # 此处定义一个函数&#xff0c;作为一个线程(子进程)

sleep 3 # 线程的作用是sleep 3s

}

tmp_fifofile&#61;”/tmp/$.fifo”

mkfifo $tmp_fifofile # 新建一个fifo类型的文件

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

rm $tmp_fifofile

thread&#61;15 # 此处定义线程数

for ((i&#61;0;i

echo

done >&6 # 事实上就是在fd6中放置了$thread个回车符

for ((i&#61;0;i<50;i&#43;&#43;));do # 50次循环&#xff0c;可以理解为50个主机&#xff0c;或其他

read -u6

# 一个read -u6命令执行一次&#xff0c;就从fd6中减去一个回车符&#xff0c;然后向下执行&#xff0c;

# fd6中没有回车符的时候&#xff0c;就停在这了&#xff0c;从而实现了线程数量控制

{ # 此处子进程开始执行&#xff0c;被放到后台

a_sub && { # 此处可以用来判断子进程的逻辑

echo ”a_sub is finished”

} || {

echo ”sub error”

}

echo >&6 # 当进程结束以后&#xff0c;再向fd6中加上一个回车符&#xff0c;即补上了read -u6减去的那个

} &

done

wait # 等待所有的后台子进程结束

exec 6>&- # 关闭df6

exit 0

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

即&#xff1a;

15×3&#61;45, 所以 3 x 3s &#61; 9s

(50-45&#61;5)<15, 所以 1 x 3s &#61; 3s

所以 9s &#43; 3s &#61; 12s

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

real        0m12.025s

user        0m0.020s

sys         0m0.064s

而当不使用多线程技巧的时候&#xff0c;执行时间为&#xff1a;50 x 3s &#61; 150s。

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

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

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

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



推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 本文总结了Linux下多线程执行shell脚本的4种方法,包括切换到工作目录执行、使用绝对路径执行、直接使用bash或sh执行。同时介绍了为什么需要加上"./"来执行脚本的原因。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • Linux批量复制并重命名和批量复制文件到多个文件夹的方法
    本文介绍了在Linux系统下批量复制并重命名文件以及批量复制文件到多个文件夹的方法。通过使用模式匹配功能,可以方便地实现文件的批量操作。同时,还提供了有关shell语法中的()和{}的参考资料。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • Tomcat安装与配置教程及常见问题解决方法
    本文介绍了Tomcat的安装与配置教程,包括jdk版本的选择、域名解析、war文件的部署和访问、常见问题的解决方法等。其中涉及到的问题包括403问题、数据库连接问题、1130错误、2003错误、Java Runtime版本不兼容问题以及502错误等。最后还提到了项目的前后端连接代码的配置。通过本文的指导,读者可以顺利完成Tomcat的安装与配置,并解决常见的问题。 ... [详细]
  •     这里使用自己编译的hadoop-2.7.0版本部署在windows上,记得几年前,部署hadoop需要借助于cygwin,还需要开启ssh服务,最近发现,原来不需要借助cy ... [详细]
  • 大坑|左上角_pycharm连接服务器同步写代码(图文详细过程)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了pycharm连接服务器同步写代码(图文详细过程)相关的知识,希望对你有一定的参考价值。pycharm连接服务 ... [详细]
author-avatar
桃花岛的小米_992
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有