当前位置: 首页 > news >正文

多线程并发Ping脚本

1. 前言

最近需要ping地址,还是挺多的,就使用python搞一个ping脚本,记录一下,以免丢失了。

2. 脚本介绍

首先检查是否存在True.txtFalse.txt文件,并在用户确认后进行删除,然后从IP.txt的文件中读取IP地址,然后使用多线程并发地对这些IP地址进行ping测试。根据测试结果,将可连接的IP地址写入True.txt文件,不可连接的IP地址写入False.txt文件。

IP.txt文件需要每一行为一个IP地址,不可放置网段,并且通信与不通信是暂存在列表中的,若中间结束ping,则数据会丢失,只有当全部运行完后,会一次性写入,之前也测试过一边测试一边写入,会出现频繁的读取文件和写入文件,总会出现IP丢失的情况。此次经过测试,无丢失情况。

测试环境:python3.10

测试结果:IP.txt中共计1.2011个IP地址,20线程,共计耗时32分钟。

image-20231208104023411

2.1. 文件夹内容

文件夹中,False.txtTrue.txt这两个文件是不需要创建的,程序会自动创建,而且IP.txt是需要创建的,并且放置~地址,每行一个,正常回车换行,或者在表格中弄好,直接复制过来。

每次执行只需要替换IP.txt中的IP地址就可以了。

image-20231208104342690

2.2. 脚本源码

这里电脑性能好,而且想快的话,直接多上一些线程,一开始我测试的时候,线程没设定好,直接给我干了2400多线程,电脑直接卡死,预估100多线程应该都没问题。

import threading
import subprocess
import os
from concurrent.futures import ThreadPoolExecutor"""判断是否存在True.txt或False.txt文,由于如果之前存在可能会导致执行添加了,但是测试好像不会,不过添加一个也无妨。"""
def check_confirmation():if os.path.exists('True.txt') or os.path.exists('False.txt'):user_input = input("发现已存在的True.txt或False.txt文件,是否删除?(y/n): ")if user_input.lower() == 'y':if os.path.exists('True.txt'):os.remove('True.txt')if os.path.exists('False.txt'):os.remove('False.txt')elif user_input.lower() == 'n':exit()else:print("无效的输入。请输入 'y' 或 'n'。")check_confirmation()def ping_ip(ip, true_ips, false_ips):"""如果IP地址能够ping通,则将其添加到true_ips列表中;否则添加到false_ips列表中。"""command = ['ping', '-n', '1', ip]result = subprocess.call(command, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)if result == 0:true_ips.append(ip)print(f"{ip} 可以ping通!")else:false_ips.append(ip)print(f"{ip} 无法ping通!")def main():check_confirmation()with open('IP.txt', 'r') as file:ips = file.readlines()true_ips = []false_ips = []"""控制线程,这里我写的是20线程。"""with ThreadPoolExecutor(max_workers=20) as executor:for ip in ips:ip = ip.strip()executor.submit(ping_ip, ip, true_ips, false_ips)"""整个程序运行完将列表中的数据写入到相应的文件夹中。"""with open('True.txt', 'w') as file:for ip in true_ips:file.write(ip + '\n')with open('False.txt', 'w') as file:for ip in false_ips:file.write(ip + '\n')if __name__ == "__main__":main()
http://www.lryc.cn/news/255662.html

相关文章:

  • SpringBoot Seata 死锁问题排查
  • 文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《考虑两阶段鲁棒优化配置的多微网合作博弈》
  • Redis常见类型
  • 深入了解数据库锁:类型、应用和最佳实践
  • python3.5安装教程及环境配置,python3.7.2安装与配置
  • ubuntu安装tomcat并配置前端项目
  • GeoPandas初体验:它是什么,我用它展示一下shp矢量数据
  • Python-滑雪大冒险【附源码】
  • Linux---日志管理
  • Java高级技术-单元测试
  • springboot集成邮箱验证功能
  • HarmonyOS应用程序框架——UIAbility实操
  • 数实融合!低代码推动工业数字化转型走“深”向“实”
  • OpenGL学习资料
  • 字符串指令集
  • 行云海CMS SQL注入漏洞复现
  • 窗口函数之 first_value() 和 last_value()
  • 习题练习讲解
  • C++STL的string模拟实现
  • 基于ZLMediaKit的webrtc实时视频传输demo搭建
  • LeetCode双指针:有序数组中的单一元素
  • 熬夜会秃头——Beta冲刺总结随笔
  • C++函数模板案例
  • 同旺科技 USB TO RS-485 定制款适配器--- 拆解(三)
  • Vue学习计划-Vue2--Vue核心(六)过滤器和自定义指令
  • Codeforces Round 913 (Div. 3) (A-G)
  • CSS——sticky定位
  • Redis hash表源码解析
  • dll动态链接库【C#】
  • Linux 系统设置cpu频率