一个多线程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 ...
最新文章
- 旺铺免费,淘宝的义务不能免
- 华人一作统一「视觉-语言」理解与生成:一键生成图像标注,完成视觉问答,Demo可玩...
- Cacti on nginx + php-fpm
- 颜色传感器TCS230的使用
- mysql建立的一个自动更新组织树案案例
- hystrix熔断 简介_Hystrix简介– Hello World
- 记:使用IScroll.js 开发picker日历组件遇到的问题及经验总结
- winform checkedlistbox不显示复选框_据说90%的人都不知道怎么解决这个Word问题
- GIT代码管理: git remote add
- feathers mysql_Go 语言操作 MySQL 之 CURD 操作
- 智能驾驶LQR横向控制算法
- 灵活无处安放,所以选择流浪....《漆黑的空间》 《灰色轨迹》
- 全渠道客户体验是什么?如何创建全渠道营销平台?
- Java语法快速学习-黑马程序员(个人整理版本)
- 以太坊中的账户、交易、Gas和区块Gas Limit等基本概念
- P4460 [CQOI2018]解锁屏幕
- 央视影音大屏版apk下载_央视影音TV版
- 支付宝付款页面html,支付页面.html
- 时下人间道的生存法则
- 学习日记——阿里云物联网平台
热门文章
- 如何搭建自己的博客网站(手把手教你搭建免费个人博客网站)
- des加密解密 代码 java_java 实现DES 加密解密的示例
- uchar 和 uchar3的疑惑
- 获取dom元素的方法
- vscode运行python没有结果输出
- linux 在指定区域分配内存 c语言,C语言动态内存分配:(一)malloc/free的实现及malloc实际分配/释放的内存...
- windows2012装sql 2000 sql 2005 vs2005的解决办法
- C语言/C++编程学习:和QT零距离接触的意义
- DirectShow编程(3.5) - 关于DirectShow - DirectShow中的事件通告
- Python 爬抖音