• python 线程池的使用


    使用场景

    CMDB 资产采集采用中控机for 循环主机列表挨个针对主机进行远程资产采集并且提交数据到API,此方式为一个一个的数据采集并提交,在主机数量庞大的请况下此方式严重耗时。

    再次引入线程池方式,例如建立10个线程,每次10个线程同时采集10个主机信息并且入库,先执行完任务的线程继续采集后面的主机信息,一直保持10线程同时执行任务。

    代码

    import requests
    import json
    
    
    def task(host):
        info = {'hostname':host,'disk':'100G'}          #采集主机的资产信息
        url = "http://127.0.0.1:8000/api/asset/"
        r1 = requests.post(                               #资产入库
            url=url,
            data=json.dumps(info).encode('utf-8')       # 对于字典等特殊数据格式需要json 对数据格式化处理,再编码才能传输
            )
        print(r1.text)
    
    
    def ssh():
        r1 = requests.get(url='http://127.0.0.1:8000/api/asset/')   #先获取要采集资产信息的主机列表信息
        host_list = r1.json()
        
        from concurrent.futures import ThreadPoolExecutor   #建立线程池
        pool = ThreadPoolExecutor(10)                         
        for host in host_list:
            pool.submit(task,host)                          #host 作为参数带入task函数中,每次执行10个task 函数任务
    View Code

    总结

    在for 循环中执行任务时,根据for 循环的列表元素挨个顺序执行,引入线程池后,将每个循环执行的任务定义成函数task,将for 循环的主机名作为参数带入任务函数task 中,定义了多少线程池数量,就同时执行几个task 任务。

    线程池数量不是越多越好,根据任务数量以及主机的cpu 等性能决定

  • 相关阅读:
    20155307 2017-2018-2 《Java程序设计》第2周学习总结
    20155307刘浩——预备作业03: 安装虚拟机
    刘浩(专业打劫三十年)20155307的预备作业02:
    刘浩的预备作业01:我期望的师生关系——————不要问我为什么我叫专业打劫三十年
    List Leaves
    树的同构
    Pop Sequence
    Reversing Linked List
    一元多项式的乘法与加法运算
    Python 基础语法复习
  • 原文地址:https://www.cnblogs.com/fanggege/p/10261057.html
Copyright © 2020-2023  润新知