Pool多进程示例

  利用Pool类多进程实现批量主机管理

  1 #!/usr/bin/python
  2 # -*- coding: UTF-8 -*-
  3 # Author:       liulixin
  4 # Time:         2017-03-02
  5 # Description:  Achieve the Multiple Processes(High Concurrent) to execute single or multiple commands functions by pool class of Python Lang.
  6
  7 import time
  8 import commands, subprocess
  9 import os, re, sys
 10 import paramiko
 11 from  multiprocessing import Pool
 12
 13 # print color
 14 COLOR_PINK    = ‘\033[95m‘
 15 COLOR_BLUE    = ‘\033[94m‘
 16 COLOR_GREEN   = ‘\033[92m‘
 17 COLOR_YELLOW  = ‘\033[93m‘
 18 COLOR_RED     = ‘\033[91m‘
 19 COLOR_DEFAULT = ‘\033[0m‘
 20
 21 def Check_IP(ip):
 22     ip_str = r‘^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$‘
 23     if re.match(ip_str, ip):
 24         return True
 25     else:
 26         return False
 27
 28 def Get_IPS(ipfile):
 29     ‘‘‘Generate ip list.‘‘‘
 30     ips = []
 31     with open(ipfile) as iplist:
 32         content = iplist.readlines()
 33         for line in content:
 34             if line.startswith(‘#‘):
 35                 continue
 36             elif Check_IP(line.strip(‘\n‘)):
 37                 ips.append(line.strip(‘\n‘))
 38             else:
 39                 print ‘%s is invalid ip address!‘ % line.strip(‘\n‘)
 40                 continue
 41     return ips
 42
 43 def concurrentFunc(ip, cmd):
 44     ‘‘‘single cmd to exec...‘‘‘
 45     #RET = subprocess.check_output("ssh [email protected]%s 2> /dev/null mkdir /data/rtmpd && mv /opt/soft/rtmpd/logs/ /data/rtmpd/logs && ln -s /data/rtmpd/logs/ /opt/soft/rtmpd/logs" % ip, shell = True)
 46     #status, output = commands.getstatusoutput("ssh [email protected]%s 2> /dev/null grep ‘^PasswordAuthentication yes‘ /etc/ssh/sshd_config" % ip)
 47     #status, output = commands.getstatusoutput("ssh [email protected]%s 2> /dev/null mkdir /data/rtmpd && mv /opt/soft/rtmpd/logs/ /data/rtmpd/logs && ln -s /data/rtmpd/logs/ /opt/soft/rtmpd/logs" % ip)
 48     #return ip+": "+output+", status: "+bytes(status)
 49     #return ip+": "+RET
 50     ‘‘‘multiple cmd to exec...‘‘‘
 51     PORT = 22
 52     USER = "root"
 53     KEY = "/home/liulixin/.ssh/known_hosts"
 54     ssh = paramiko.SSHClient()
 55     try:
 56         ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 57         ssh.connect(ip, PORT, USER, KEY, timeout=10)
 58     except paramiko.AuthenticationException:
 59         print ip+" ssh timeout, continue..."
 60         return "SSH ERROR, exit..."
 61     output = []
 62     output.append(ip)
 63     for m in cmd:
 64         stdin, stdout, stderr = ssh.exec_command(m)
 65         output.append(stdout.readlines())
 66     return output
 67
 68 def callBackFunc(ret):
 69     print "This is callback func of %s" % ret[0]
 70
 71 def output(res_list):
 72     print "%s=================RESULT====================%s" % (COLOR_GREEN, COLOR_DEFAULT)
 73     for res in res_list:
 74         try:
 75             print res.get()[0] + " -> " + ‘‘.join(res.get()[1])
 76         except Exception, e:
 77             print "%sOUTPUT ERROR: %s %s" % (COLOR_YELLOW, e, COLOR_DEFAULT)
 78             continue
 79
 80 if __name__ == ‘__main__‘:
 81     ipfile = sys.argv[1]
 82     if os.path.isfile(ipfile):
 83         ips = Get_IPS(ipfile)
 84     elif Check_IP(ipfile):
 85         ips = [sys.argv[1]]
 86     else:
 87         print ‘%s is invalid ip address!‘ % ipfile
 88         sys.exit(1)
 89
 90     res_list = []
 91     #cmd = [‘ls -l /opt/soft/rtmpd/logs |awk \‘{print $9,$10,$11}\‘‘, ‘ls -l /opt/soft/rtmpd/logs/error.log |awk \‘{print $6" "$7" "$8}\‘‘]
 92     cmd = [‘/opt/soft/ats/bin/traffic_ctl config status‘]
 93     t_start=time.time()
 94     #pool = Pool(32)
 95     pool = Pool(10)
 96     for ip in ips:
 97     #维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去
 98         res = pool.apply_async(func=concurrentFunc, args=(ip, cmd,), callback=callBackFunc)
 99         res_list.append(res)
100     pool.close()
101     pool.join()
102     pool.terminate()
103     output(res_list)
104     t_end=time.time()
105     t=t_end-t_start
106     print ‘%sDealt %d, used time is :%s.%s‘ % (COLOR_BLUE, len(res_list), t, COLOR_DEFAULT)
时间: 2024-10-08 03:24:32

Pool多进程示例的相关文章

Python异常处理和进程线程-day09

写在前面 上课第九天,打卡: 最坏的结果,不过是大器晚成: 一.异常处理 - 1.语法错误导致的异常 - 这种错误,根本过不了python解释器的语法检测,必须在程序运行前就修正: - 2.逻辑上的异常 - 即逻辑错误,例如除零错误: - 异常相关信息:异常的追踪信息 + 异常类型 + 异常值 - 异常种类 1 ArithmeticError 2 AssertionError 3 AttributeError 4 BaseException 5 BufferError 6 BytesWarnin

python多进程并发编程

Python提供了非常好用的多进程包multiprocessing,你只需要定义一个函数,Python会替你完成其他所有事情. 借助这个包,可以轻松完成从单进程到并发执行的转换. 一.单进程编程 如果我们新建少量进程,可以如下: import multiprocessing import time def func(msg): for i in xrange(3): print msg time.sleep(1) if __name__ == "__main__": p = multi

php多进程编程实现与优化

PHP多进程API 创建子进程 @params void @returns int int pcntl_fork(void) 成功时,在父进程执行线程内返回产生的子进程PID,在子进程执行线程内返回0,失败时,在父进程上下文返回-1,不会创建子进程,并且会引发一个php错误 获取当前进程id @params void @returns int int posix_getpid(void) 返回进程id,类型为整型 父进程等待子进程退出 @params $status @params $optio

python多线程

http://blog.csdn.net/pipisorry/article/details/45306973 CPU-bound(计算密集型) 和I/O bound(I/O密集型) I/O bound 指的是系统的CPU效能相对硬盘/内存的效能要好很多,此时,系统运作,大部分的状况是 CPU 在等 I/O (硬盘/内存) 的读/写,此时 CPU Loading 不高.CPU bound 指的是系统的 硬盘/内存 效能 相对 CPU 的效能 要好很多,此时,系统运作,大部分的状况是 CPU Lo

4.2 进程

目录 4.2.1 相关概念 4.2.1.1 进程 4.2.1.2 同步/异步 4.2.1.3 阻塞/非阻塞 4.2.1.4 并发/并行 4.2.1.5 进程状态与调度 4.2.2 多进程 4.2.1.1 创建进程 4.2.1.2 相关属性 4.2.1.1 相关方法 4.2.3 进程互斥锁 4.2.4 进程池 4.2.4.1 创建进程池 4.2.4.2 相关方法 4.2.4.3 操作实例 4.2.1 相关概念  4.2.1.1 进程  4.2.1.2 同步/异步  4.2.1.3 阻塞/非阻塞  

python fcntl 文件锁

此模块只有在 unix 系统上才有,windows 没有. 文档地址: https://docs.python.org/3.7/library/fcntl.html https://www.docs4dev.com/docs/zh/python/3.7.2rc1/all/library-fcntl.html 多进程示例程序 import fcntl import os import time from multiprocessing import Pool def worker(): print

浅谈ThreadPool 线程池(引用)

出自:http://www.cnblogs.com/xugang/archive/2010/04/20/1716042.html 浅谈ThreadPool 线程池 相关概念: 线程池可以看做容纳线程的容器: 一个应用程序最多只能有一个线程池: ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池: 每排入一个工作函数,就相当于请求创建一个线程: 线程池的作用: 线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程

常见问题汇总(2)

关于存储的一些问题 Ceph增加osd的方法 如果在部署环境前无法识别硬盘,但是环境又要求存储必须为ceph,可以用如下方法: 部署模式按ceph走,在磁盘划分的时候根据实际情况划分 环境部署成功且各组件正常工作,这时候到相应的节点查看部署前未被识别的硬盘是否被识 别(注:不要对识别的新硬盘进行分区格式化!!!)如果有,请按如下方法进行ceph 的osd的增加: 1:首先查看当前环境的ceph环境 ceph osd tree node-xxx osd.4  up 记住相应节点的当前有几个osd,

ceph(rbd、cephfs)磁盘挂载详解

1:RBD方式挂载 2:cephfs 挂载 3:对象文件上传下载 ####################RBD方式挂载################################### 1:安装ceph软件包.同步集群配置文件和key Yum install ceph –y 2:新建一个ceph pool ceph osd pool create {pool-name} {pg-num} [{pgp-num}]   实例 ceph osd pool create rbdpool 100 1