一个多线程Ping 类
需求背景:
部门内部一个监控项目需要快速Ping批量的IP地址,在网上找了很多资料结合各家之所长,写了一个多线程Ping类,可以实现快速的ping,并且格式化的返回IP状态。
主要解决痛点:
1.为什不直接用Linux command?
一个两个可以,对于批量上千个ip来说,用Linux command 就有点不太适合了
2.为什么用多线程而不是用多进程?
进程提供了多道编程,充分发挥了计算机部件的并行性,提高了计算机的利用率,既然进程这么优秀,为什么还要线程呢? 其实,还是有很多缺陷的,主要体现在两点上:
进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。
进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。而解决办法就是让单个进程,接受请求、等待I/O、处理计算并行起来,这样很明显可以避免同步等待,提高执行效率,在实际操作系统中这样的机制就是——线程。
很显然我批量的Ping的绝大部分时间不是浪费在CPU执行ping的命令而是等待网络返回状态上
3.怎么不用线程锁?
这里涉及到一个“锁”的问题,如果有多个线程同时操作一个对象,如果没有很好地保护该对象,会造成程序结果的不可预期(比如我们在每个线程的run方法中加入一个time.sleep(1),并同时输出线程名称,则我们会发现,输出会乱七八糟。因为可能我们的一个print语句只打印出一半的字符,这个线程就被暂停,执行另一个去了,所以我们看到的结果很乱),这种现象叫做“线程不安全”,网上的方法绝大多是都没有线程锁。
4.你怎么起了这么多线程?
对于像我这种成百上千IP多状况,网上的其他方法绝大多数都是有多少ip,起多少线程,起太多线程反而是对资源的浪费,也不会提高运行速度太多,应为GIL。
5.返回结果不够格式化,不好操作?
直接print结果是什么鬼,我有不是用来做实验演示多线程的。
废话很多不如直接上代码:
#!/usr/bin/env pythonimport subprocess
import threadingclass Pinger(object):def __init__(self):# Populated while we are runningself.status = {'alive': [], 'dead': []}self.hosts = [] # List of all hosts/ips in our input queue# How many ping process at the time.thread_count = 4# Lock object to keep track the threads in loops, where it can potentially# be race conditions.lock = threading.Lock()def ping(self, ip):# Use the system ping command with count of 1 and wait time of 1.ret = subprocess.call(['ping', '-c', '1', '-W', '1', ip],stdout=open('/dev/null', 'w'), stderr=open('/dev/null', 'w'))return ret == 0 # Return True if our ping command succeedsdef pop_queue(self):ip = Noneself.lock.acquire() # Grab or wait+grab the lock.if self.hosts:ip = self.hosts.pop()# Release the lock, so another thread could grab it.self.lock.release()return ipdef dequeue(self):while True:ip = self.pop_queue()if not ip:return Noneresult = 'alive' if self.ping(ip) else 'dead'self.status[result].append(ip)def start(self):threads = []for i in range(self.thread_count):# Create self.thread_count number of threads that together will# cooperate removing every ip in the list. Each thread will do the# job as fast as it can.t = threading.Thread(target=self.dequeue)t.start()threads.append(t)# Wait until all the threads are done. .join() is blocking.[t.join() for t in threads]return self.status# if __name__ == '__main__':
# ping = Pinger()
# ping.thread_count = 8
# ping.hosts = [
# '10.0.0.1', '10.0.0.2', '10.0.0.3', '10.0.0.4', '10.0.0.0', '10.0.0.255', '10.0.0.100',
# 'google.com','192.168.1.100','192.168.1.101','github.com', 'nonexisting', '127.0.1.2', '*not able to ping!*', '8.8.8.8'
# ]
# print ping.start()
一个多线程Ping 类相关推荐
- python 多线程 类_Python中如何自定义一个多线程类呢?
摘要: 下文讲述Python中自定义一个多线程类的方法分享,如下所示: 实现思路: 1.定义一个类继承threading.Thread 2.在自定义类中构造函数重写run方法 例: Python3中自 ...
- scratch做简单跑酷游戏_腾讯游戏学院专家:做一个多线程游戏框架可以多简单?...
导语 如何做一个多线程游戏框架?腾讯游戏学院专家Tao将在本文通过一个demo来说说游戏逻辑的多线程化. 众所周知现在各种游戏终端的发展十分迅猛.其中一个共同的特征是"多核化",由 ...
- 多线程——实现Runnable接口实现一个多线程
实现Runnable接口实现一个多线程 Runnable接口源码: package java.lang; //Runnable接口源码只有一个run方法 public interface Runnab ...
- python写机器人程序_用Python写的一个多线程机器人聊天程序
本人是从事php开发的, 近来想通过php实现即时通讯(兼容windows).后来发现实现起来特别麻烦, 就想到python.听说这家伙在什么地方都能发挥作用.所以想用python来做通讯模块...所 ...
- 多线程Thread类创建多线程
package com.ajax; //多线程Thread类创建多线程 public class Example02 {public static void main(String[] args){n ...
- stringbuilder删除最后一个字符_Java类-StingBuffer,StringBuilder
Java提供了String,StringBuffr,StringBuilder类来封装字符串,并提供了一系列操作字符串对象的方法. 他们的相同点都是封装字符串;都实现了CharSeqence接口. p ...
- java使用socket实现一个多线程web服务器
全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用socket实现一个多线程web服务器 除了服务器类,还包括请求类和响应类 请求类:获取客户的HTTP请求,分析客户所需要的文件 响应 ...
- 为什么写了value属性 jq赋值value值不显示_为什么 String 要设计成 final,又如何设计一个不可变类呢?...
前面聊了聊面试必考 String 的坑,具体可以细看<你真的懂 Java 的 String 吗?>,也留下了一个疑问,为什么 String 要被设计成 final 呢?其实,如果你读的认真 ...
- Unity 之 Ping类简析尝试使用
Ping 什么意思??? [来自百度百科的诠释:] Ping是Windows.Unix和Linux系统下的一个命令.ping也属于一个通信协议,是TCP/IP协议的一部分.利用"ping&q ...
最新文章
- 08-图7 公路村村通
- 进程死锁的危害、导致原因和解决方法
- Spring(IOC+AOP)
- c#windows消息循环sendmessage实例
- Performance Tuning
- Error:配置系统未能初始化
- Python函数调用的九大方法,鲜为人知
- 计算机yiji教案,剑桥一级下册详细教案
- cisco配置和ios备份
- Unity3D:2D角色移动篇2:动画的添加
- 蕃茄工作法 - 让你轻松应对繁忙的工作
- disk-磁盘检测工具(二合一)
- Linux网络开始收发包之前需要做的事情——创建ksoftirqd内核进程
- Breakpoint原理解释
- 认证模式之Digest模式
- 30岁是全新的20岁?---《20岁时光不再来》
- CCS 2022 极客少年挑战赛 writeup
- 新品周刊 | ​内外、UR、迪士尼商店、Kipling、资生堂、林清轩等女王节新品发布...
- Python 列表、元素、字典
- JAVA编程实现猜数游戏
热门文章
- 2022.04.04树莓派最新镜像问题,树莓派如何设置初始化的账户和密码
- mysql 1701,MySQL ERROR 1701 (42000)
- C语言中经典算法——斐波那契数列的几种算法
- 如何从request中获取域名
- 做开发遇到35岁瓶颈被裁员,体验了一把“自由职业”,最后入行了软件测试...
- type="button" ,"submit" 的区别
- 华为南研所2014春季机试题目-2不能入住的房客数
- C++函数UpdateData()有什么作用?
- SSL单向、双向认证
- 利用matlab的interp1()对矩阵进行插值