多个数据provider同时执行怎么实现?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多个数据provider同时执行怎么实现?相关的知识,希望对你有一定的参考价值。
队列有三个数据provider,分别随机的间隔1~3秒向队列插入字符。Provider1插入字符a,Provider2插入字符b,Provider3插入字符c,每次插入字符的长度是随机1~10个字符。与此同时,队列有1个receiver,以1秒/字符的速度从队列中取字符(不用知道返回值)。队列长度设置为100。
我已经定义了一个数组循环队列,有Add和Delete函数。我要怎么才能实现几个Provider和receiver同时执行而不产生冲突,另外那个随机时间间隔执行一次怎么实现?
有好方法的话一定追分,人品担保。最重要的部分是那个随机间隔1-3秒执行一次怎么实现?
给Provider加个互斥量,让同一时间只有一个Provider访问队列.当该Provider写完字符之后,释放互斥量给下一个Provider.这样多个Provider同时执行可不冲突.也可以用Provider队列来完成,那样更简单.
至于Receiver可以独立运行,只要再加一判断,让Receiver读取数据直到Provider写入的数据之前就可不与Provider冲突了.举个例子说,Provider1插入字符串a,长度为1;Provider2插入字符串b,长度为3;Provider3插入字符串c,长度为7.则Receiver取字符时判断是不是超过11,未超过则取字符,否则等到Provider再次插入字符时再取.
随机间隔执行一次就要根据不同的语言来完成了.可以用延时函数,传个随机数作为延时时间参数.也可用多个控件,然后随机选择运行来实现。
参考技术A
一般要2-3秒你集开开吧只能帮到这
SHELL实现同时操作多个服务器:服务器批量管理
引言:
1.如果你想知道你所管理的几万台服务器的/home分区使用率是多少。
2.如果你想为你所管理的几万台服务器添加同一个计划任务你该怎么办?
3.如果你想让你所管理的几万台服务器执行同一个刚刚写好的备份脚本怎么办?
一台一台的去处理?这当然不行。
所以你最有可能想到的,就是写一个循环,在这几万台机器中循环,执行同样的操作。
可是、如果经常需要做这样的操作,每天写数次循环会不会太累了呢?
更要命的是,当你要循环的主机列表或IP地址池每次都不同时,你又该怎么办呢?
所以,本文中的脚本,就是来解决这个问题的。
---------------------------------------------
哇咔咔,好久不写博客了。两年前,本人还是个新手,有很多已有的工具可以实现各种功能,但是当时的我并不知道有这些东西。所以无论需要什么功能,都是自己
动手写。当时有个需求,需要对很多服务器做相同的操作,而当时的我,并不知道有puppet之类的东西,所以没办法,只能自己写脚本了。
现在两年过去了,这脚本仍然在使用,因为有些功能puppet无法实现,或者说:无法立刻部署成功。所以当初写的这脚本,如今看来仍然有用武之处,所以,今天就贴出来供大家分享。
由于脚本是很久之前写的了,年久失修,里面有些东西已经不适用本公司现在的架构了,但是为了演示功能,那些已被弃用的功能,仍然贴了出来。与本人在线上使用的脚本相比,本文几乎没有任何删改(当然:公司的域名被我替换成example.com了)。
阅读本文的前提是:你已经了解过bash4的新特性了,并且你的所有服务器之间都已经有了信任关系。
本脚本的架构是:
在中控机(本人的是:d008.example.com)上执行要执行的命令,以及在哪些机器上执行这些命令。
脚本有一函数对用户指定的主机列表进行解析,得到最终要执行某命令的主机列表。
例如:m001-m123,表示用户要在m001至m123共123台机器上执行某命令。而该函数的功能就是:
把m001-m123解析成:m001,m002,m003....m123这样的主机列表。
最后再在解析出的主机列表中循环,依次ssh过去并执行用户指定的命令。如果用户要执行的是个脚本,而不是普通命令,那么要先把脚本scp过去,再进行执行。
大体就是这么个思想,具体实现时,可以设置不同选项来控制脚本的行为。
本人已实现的选项有如下几个(仿man page格式做的使用说明,对齐做的不太好)
.
rchange是脚本名,部署在了/bin目录下,由于是批量更改N多服务器的配置,所以就把脚本命名为rchange
已实现的选项有:
-a COMMAND 指定要执行的命令,当使用-a时,rchange的所有剩余位置参数都是要执行的命令的一部分。
-c COMMAND 指定要执行的命令,当使用-c时,只有跟在-c后面的第一个参数,才是要执行的命令,第二个及之后的参数,均为rchange的其他option,如果该命令有参数,要把命令和参数放进同一对引号里(推荐单引号)
说明下-a和-c的区别,如下例所示:
rchange -a ls -l该命令表示要执行‘ls -l‘这个命令,因为-a后面所有的参数都会被认定为命令的一部分
rchange -c ls -l该命令表示要执行‘ls’这个命令,而‘-l‘是rchange的另外一个选项,‘-l‘并不属于要执行的命令,而属于rchange
为避免歧义,强烈推荐将要执行的命令用一对单引号引起来,不推荐双引号,因为使用双引号时,命令中的通配符会被解析,进而造成命令执行失败,脚本行为将不可预期。
-d debug的意思,显示一些debug信息,方便调试。
-H 指定要执行命令的主机列表,可以使用‘-‘来指定一个范围,如:m001-m100表示100台机器。多个主机用逗号隔开,如:rchange -H d015,f018-f023,n005-n522
-e
except排除,在已指定的主机或IP列表中排除某个或某段IP,比如想使m001-m100(m052除外)这99台机器执行某命令,执行如下命令即
可:rchange -H m001-m100 -e m052,这样就会排除m052这台机器。排除多个主机可用逗号隔开,如:rchange -H
m001-m100 -e m052,m067,m091-m-94这样一共会排除6台主机,最终有94台会执行你指定的命令。
-h --help 打印帮助
-v --version 显示程序版本
-x --example 显示使用示例
这3个没什么可说的。
-m (mode)改变运行模式。当在很多主机执行同一个命令时,脚本默认会并行执行,即、在所有机器上同时执行,当使用-m选项时,脚本会改成串行执行。就是一个接一个地来。
-n
(name)在每一台主机上执行某命令之前,先打印该主机的主机名。当你想查看系统的什么属性时,这个选项会很有用,他会使显示更人性化。当使用-n选项
时,脚本的运行模式会强制使用串行,因为并行执行时,无法判断主机名和程序输出的对应关系,一瞬间屏幕就满了,根本什么也看不出来。
-s
(script)当使用-s选项时,-s后面跟着的第一个参数,会被认为是个脚本,而不是普通的命令,此时rchange会把这个脚本scp到所有要执行
这个脚本的主机上,之后再执行,rchange以该脚本的扩展名来判断要调用的解释器,如:.pl会被认定是perl脚本,.py会被认定是python
脚本,.php会被认定是php脚本,其他所有都会被认定是shell脚本(bash),当然,您也可以根据其他方式来判断,这里我就是这么设置并演示
的。
还有如下3个长选项,这3个选项是后加进去的,所以当使用时,不要使用其他选项,如果非要使用,必须把长格式选项放在前面,其他短选项放在后面,因为本人使用这几个选项时,基本不指定主机列表,所以就没考虑那么多。
--md5 显示所有主机中的filename的md5值。此选项强制使用串行模式,并强制打印主机名。
使用该选项时,默认主机列表包括中控机(d008)
--sync 从中控机同步filename这个文件,使得所有主机中的该文件,都和中控机中的该文件一致。
--list 在所有主机中执行ls -lh ,查看所有机器中这文件的属性神马的。
--md5和--list的执行结果如下:(--sync只是同步,没有输出)
其他选项的使用示例:
好了,现在开始贴代码,最近比较懒,中文注释就不写了,原文中有注释,但是是英文写的,对付看吧,不过我也没用什么生僻的单词,所以理解起来应该不费劲。
首先,贴的是/bin/rchange.doc,因为帮助的内容也很多,所以单独放在这个文件里了。
rchang.doc.part1:
rchange.doc.part2:
rchange.doc.part3:
接下来就是脚本的功能代码了:
rchang.part1:
rchang.part2:
rchang.part3:
rchang.part4:
rchang.part5:
rchang.part6:
rchang.part7:
rchang.part8
:
rchang.part9:
完结。
因为本人所在公司所有服务器的域名都是d001-d***和z001-z***这样的规则命名的,所以我就按这个规则写的解析主机列表,如果你的公司服务器命名规则不同(大部分人都会和我这里不同),那么重新写一个适合自己公司的解析函数即可。
我注释写的不是很多,但也写了几句,应该不至于看不懂吧。本文仅提供思想,仅供参考。
以上是关于多个数据provider同时执行怎么实现?的主要内容,如果未能解决你的问题,请参考以下文章
请问我在Linux下想实现一个终端同时通过SSH执行其它多个终端内的shell脚本怎么实现?
Guitar prov5.2为啥只有拨弦的声音
MyBatis的Mapper.xml怎么同时执行多个sql语句
MyBatis的Mapper.xml怎么同时执行多个sql语句
mvn 编译报错mavn sun.security.validator.ValidatorException: PKIX path building failed: sun.security.prov
SHELL实现同时操作多个服务器:服务器批量管理