• python监视线程池


    先上代码:

    #!/usr/bin/python
    import threading
    import time
    
    class Monitor(threading.Thread):
        def __init__(self, *args,**kwargs):
            super(Monitor,self).__init__()
            self.daemon = False
            self.args = args
            self.kwargs = kwargs
            self.pool_list = []
        
        def run(self):
            print self.args
            print self.kwargs
            for name,value in self.kwargs.items():
                obj = value[0]
                temp = {}
                temp[name] = obj
                self.pool_list.append(temp)
            while 1:
                print self.pool_list
                for name,value in self.kwargs.items():
                    obj = value[0]
                    parameters = value[1:]
                    died_threads = self.cal_died_thread(self.pool_list,name)
                    print "died_threads", died_threads
                    if died_threads >0:
                        for i in range(died_threads):
                            print "start %s thread..." % name
                            t = obj[0].__class__(*parameters)
                            t.start()
                            self.add_to_pool_list(t,name)
                    else:
                        break
                time.sleep(0.5)
    
        def cal_died_thread(self,pool_list,name):
            i = 0
            for item in self.pool_list:
                for k,v in item.items():
                    if name == k:
                        lists = v
            for t in lists:
                if not t.isAlive():
                    self.remove_from_pool_list(t)
                    i +=1
            return i
        
        def add_to_pool_list(self,obj,name):
            for item in self.pool_list:
                for k,v in item.items():
                    if name == k:
                        v.append(obj)
        
        def remove_from_pool_list(self, obj):
            for item in self.pool_list:
                for k,v in item.items():
                    try:
                        v.remove(obj)
                    except:
                        pass
                    else:
                        return

    使用方法:

        rrds_queue = Queue.Queue()
        
        make_rrds_pool = []
        for i in range(5):
            make_rrds_pool.append(MakeRrds(rrds_queue))
        for i in make_rrds_pool:
            i.start()
        
        
        make_graph_pool = []
        for i in range(5):
            make_graph_pool.append(MakeGraph(rrds_queue))
        for i in make_graph_pool:
            i.start()
        
        
        monitor = Monitor(make_rrds_pool=(make_rrds_pool, rrds_queue), \
                          make_graph_pool=(make_graph_pool, rrds_queue))
        monitor.start()

    解析:

    1. 接受字典参数,value为一个元组,第一个元素是线程池,后面的都是参数。

    2. 每0.5秒监视线程池中的线程数量,如果线程死掉了,记录死掉线程的数目,再启动同样数量的线程。

    3. 如果没有线程死去,则什么也不做。

  • 相关阅读:
    二叉树的遍历
    深度优先遍历和广度优先遍历
    N的阶乘末尾有多少个0
    框架产生的历史
    Ansible--初始ansible
    日积跬步05
    日积跬步04
    日积跬步03
    日积跬步02
    日积跬步01
  • 原文地址:https://www.cnblogs.com/huazi/p/2621461.html
Copyright © 2020-2023  润新知