python 使用多线程ping内网电脑是否能连接(是否开机)
项目需要检测内网机器是否能连通(是否开机),说明一下,该方法要检测机器是否开机必须保证脚本运行机器能正常ping通其它机器。因为单独ping一台机器就需要几秒时间,所以每个独立线程检测的ip越少也就越快。
import os
import time
import threading
from functools import wraps
def info(arg): #修饰函数
def _info(func):
@wraps(func)
def wrapper(*args,**kwargs):
if arg=='len':
ret = func(*args, **kwargs)#
if ret:
c=len(ret[0])
print('等分长度:{} 拆分后列表长度:{}'.format(c,len(ret)))
else:
print('拆分列表为空')
elif arg=='time':
start=time.time()
ret = func(*args, **kwargs)#, **kwargs
end=time.time()
print('运行时间:{}'.format(end-start))
return ret
return wrapper
return _info
class IPcheck(object):
def __init__(self):
super(IPcheck, self).__init__()
self.ip_data={} #检测当前ip对应的返回结果
@info('len')
def clip_list(self,a,c): #切分列表
"""
列表拆分
:param a:
:param c:
:return:
"""
clip_back=[]
if len(a)>c:
for i in range(int(len(a) / c)):
# print(i)
clip_a = a[c * i:c * (i + 1)]
clip_back.append(clip_a)
# print(clip_a)
# last
last = a[int(len(a) / c) * c:]
if last:
clip_back.append(last)
return clip_back
def isOpen(self,ip): #检测能否ping通机器
"""
检测电脑是否开机
:param ip:
:return:
"""
cmd="ping {}".format(ip)
result= os.popen(cmd)
text=result.read()
result.close()
if '请求超时' in text or '无法访问目标主机' in text:#无法访问目标主机
return False
else:
return True
# @info('time')
def check_list(self,ip_list):
"""
单个线程对传入的ip_list进行循环检测结果,并更新全局ip_data信息
:param ip_list: ['192.168.1.1', '192.168.1.2', '192.168.1.3', '192.168.1.4', '192.168.1.5']
:return:
"""
data={}
print('检测ip开始:',ip_list[0])
for ip in ip_list:
result=self.isOpen(ip)
data[ip]=result
self.ip_data.update(data)
print('检测ip结束:',ip_list[0])
@info('time')
def check(self,a,c=5):
"""
传入拆分后的ip_list
:param clip_ip_list: [['192.168.1.1', '192.168.1.2', '192.168.1.3', '192.168.1.4', '192.168.1.5'],
['192.168.1.6', '192.168.1.7', '192.168.1.8', '192.168.1.9', '192.168.1.10'],...]
:return:
"""
clip_ip_list=self.clip_list(a,c)
thread_list=[]
for ip_list in clip_ip_list:
clipThread=threading.Thread(target=self.check_list, args=(ip_list,))
thread_list.append(clipThread)
clipThread.start()
for t in thread_list: #等所有线程结束
t.join()
print('ip_data:',len(self.ip_data),self.ip_data)
if __name__ == '__main__':
ip_list = ['192.168.1.{}'.format(n) for n in range(1, 256)]
ic=IPcheck()
ic.check(ip_list,2) #每个线程检测2个ip
#运行结果
...
ip_data: 255 {'192.168.1.255': True, '192.168.1.11': True,...}
运行时间:39.941144943237305
本文介绍了一种利用Python多线程技术批量检测局域网内计算机开机状态的方法。通过将待检测IP地址列表拆分成小批次,并为每批启动一个线程来执行Ping操作,可以显著提高检测效率。
1万+

被折叠的 条评论
为什么被折叠?



