Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1423387
  • 博文数量: 264
  • 博客积分: 5810
  • 博客等级: 大校
  • 技术积分: 3528
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-13 17:15
文章分类

全部博文(264)

文章存档

2011年(264)

分类: Python/Ruby

2011-09-21 07:58:12

业务场景:需要在做线上操作之前进行一次尝试判断主机是否都是可以连接。由于一次遍历所涉及到的主机数量比较多,所以采用多线程方式来实现!
代码如下:
  1. import Queue, threading
  2. import paramiko
  3. class Worker(threading.Thread):
  4.     failhostlist = []                           #表示失败的主机列表
  5.     def run(self):
  6.         while 1:
  7.             if self.q.qsize() == 0:break
  8.             host, sudo_user, sudo_pass = self.q.get()  #从队列里面拿数据
  9.             self.pssh_action(host, sudo_user, sudo_pass)  #干活的内容
  10.             self.q.task_done()    #表示任务已完成了向队列发一个信号                     
  11.             return                #干完活了就可以终止掉线程了return  退出

  12.     def pssh_action(self,host,sudo_user,sudo_pass):
  13.         s=paramiko.SSHClient()
  14.         s.load_system_host_keys()
  15.         try:
  16.             s.connect(hostname=host,username=sudo_user,password=sudo_pass,timeout=3)
  17.             s.close()
  18.         except Exception,e:
  19.             self.failhostlist.append(host)
  20.             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       

阅读(3239) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~