业务场景:需要在做线上操作之前进行一次尝试判断主机是否都是可以连接。由于一次遍历所涉及到的主机数量比较多,所以采用多线程方式来实现!
代码如下:
- import Queue, threading
-
import paramiko
-
class Worker(threading.Thread):
-
failhostlist = [] #表示失败的主机列表
-
def run(self):
-
while 1:
-
if self.q.qsize() == 0:break
-
host, sudo_user, sudo_pass = self.q.get() #从队列里面拿数据
-
self.pssh_action(host, sudo_user, sudo_pass) #干活的内容
-
self.q.task_done() #表示任务已完成了向队列发一个信号
-
return #干完活了就可以终止掉线程了return 退出
-
-
def pssh_action(self,host,sudo_user,sudo_pass):
-
s=paramiko.SSHClient()
-
s.load_system_host_keys()
-
try:
-
s.connect(hostname=host,username=sudo_user,password=sudo_pass,timeout=3)
-
s.close()
-
except Exception,e:
-
self.failhostlist.append(host)
-
return
调用如下:
thread_pool = []
queue = Queue.Queue(0) #队列长度无限长
for host in A:
queue.put([host, 'username', 'password']) #将任务放到队列里面
for i in range(4):
worker = Worker()
worker.q = queue #Python中的动态修改类的属性。这就是动态语言的魅力!
worker.start()
thread_pool.append(worker) #将当前这个子线程添加到线程池里面去!
for i in range(4):
thread_pool[i].join() #线程池里面的子线程之间join(表示堵塞直到全部都干完活了)
print worker.failhostlist
阅读(3219) | 评论(0) | 转发(0) |