热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python多线程popenping指定IP是否在线判断连通

Python多线程popen应用场景:有多台设备需要维护,周期短,重复度高;单台设备配备多个IP,需要经常确认网络是否通常;等等其他需要确

点击上方蓝字 ● 关注捷创源科技

问题描述

在某些问题背景下,需要确认是否多台终端在线,也就是会使用我们牛逼的ping这个命令,做一些的ping操作,如果需要确认的设备比较少,也还能承受。倘若,在手中维护的设备很多,那么这无疑会变成一个恼人的问题。脚本的作用就凸显了。另外,我们需要使用多线程的一种措施,否则单线程很难在很短的时间内拿到统计结果。

应用背景

有多台设备需要维护,周期短,重复度高;

单台设备配备多个IP,需要经常确认网络是否通常;

等等其他需要确认网络是否畅通的地方

1.采用单线程问题解决

    import time
    import os


    status1 = 'ping success'
    status2 = 'ping fail'




    def pingComputer():
    for i in range(1, 256):
    host = '192.168.2.' + str(i)


    nowTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    p = os.popen("ping " + host + " -n 2")
    line = p.read()


    # print(line)


    if "无法访问目标主机" in line:
    print(nowTime, host, status2)
    else:
    print(nowTime, host, status1)




    """
    ========================================
    主函数功能测试
    ========================================
    """
    if __name__ == '__main__':
    pingComputer()

    2.采用多线程问题解决

      """=== coding: UTF8 ==="""
      # 线程池:一次性开辟一些线程,我们用户直接给线程池提交任务,线程任务的调度交给线程池来完成
      from concurrent.futures import ThreadPoolExecutor
      import time
      import os


      # 成功标志状态
      status1 = 'ping success'
      # 失败标志状态
      status2 = 'ping fail'
      # 成功ping通IP列表
      listHostSuccess = []
      # 失败ping不通IP列表
      listHostFail = []




      def pingComputer(host):
      nowTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
      p = os.popen("ping " + host + " -n 2")
      line = p.read()


      # print(line)


      if "无法访问目标主机" in line:
      listHostFail.append(host)
      print(nowTime, host, status2)
      else:
      listHostSuccess.append(host)
      print(nowTime, host, status1)




      def printResult():
      print(f"ping通:{len(listHostSuccess)}个")
      print(listHostSuccess)
      print(f"ping不通:{len(listHostFail)}个")
      print(listHostFail)




      """
      ========================================
      主函数功能测试
      ========================================
      """
      if __name__ == '__main__':
      # 创建线程池,50个线程
      with ThreadPoolExecutor(50) as pool:
      for i in range(1, 256): # 255个IP
      pool.submit(pingComputer, host=f"192.168.2.{i}")


      # 等待线程池中的任务全部执行完毕,才能继续执行(守护)
      print("完毕")


      # 打印结果
      printResult()


      关注上面微信公众号“捷创源科技”,每天获取技术干货,让我们一起成长!



      推荐阅读
      author-avatar
      小荷蛋蛋图_945
      这个家伙很懒,什么也没留下!
      PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
      Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有