python 使用多线程ping内网电脑是否能连接(是否开机)

本文介绍了一种利用Python多线程技术批量检测局域网内计算机开机状态的方法。通过将待检测IP地址列表拆分成小批次,并为每批启动一个线程来执行Ping操作,可以显著提高检测效率。
部署运行你感兴趣的模型镜像

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

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值