需求背景:

部门内部一个监控项目需要快速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 类相关推荐

  1. python 多线程 类_Python中如何自定义一个多线程类呢?

    摘要: 下文讲述Python中自定义一个多线程类的方法分享,如下所示: 实现思路: 1.定义一个类继承threading.Thread 2.在自定义类中构造函数重写run方法 例: Python3中自 ...

  2. scratch做简单跑酷游戏_腾讯游戏学院专家:做一个多线程游戏框架可以多简单?...

    导语 如何做一个多线程游戏框架?腾讯游戏学院专家Tao将在本文通过一个demo来说说游戏逻辑的多线程化. 众所周知现在各种游戏终端的发展十分迅猛.其中一个共同的特征是"多核化",由 ...

  3. 多线程——实现Runnable接口实现一个多线程

    实现Runnable接口实现一个多线程 Runnable接口源码: package java.lang; //Runnable接口源码只有一个run方法 public interface Runnab ...

  4. python写机器人程序_用Python写的一个多线程机器人聊天程序

    本人是从事php开发的, 近来想通过php实现即时通讯(兼容windows).后来发现实现起来特别麻烦, 就想到python.听说这家伙在什么地方都能发挥作用.所以想用python来做通讯模块...所 ...

  5. 多线程Thread类创建多线程

    package com.ajax; //多线程Thread类创建多线程 public class Example02 {public static void main(String[] args){n ...

  6. stringbuilder删除最后一个字符_Java类-StingBuffer,StringBuilder

    Java提供了String,StringBuffr,StringBuilder类来封装字符串,并提供了一系列操作字符串对象的方法. 他们的相同点都是封装字符串;都实现了CharSeqence接口. p ...

  7. java使用socket实现一个多线程web服务器

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用socket实现一个多线程web服务器 除了服务器类,还包括请求类和响应类 请求类:获取客户的HTTP请求,分析客户所需要的文件 响应 ...

  8. 为什么写了value属性 jq赋值value值不显示_为什么 String 要设计成 final,又如何设计一个不可变类呢?...

    前面聊了聊面试必考 String 的坑,具体可以细看<你真的懂 Java 的 String 吗?>,也留下了一个疑问,为什么 String 要被设计成 final 呢?其实,如果你读的认真 ...

  9. Unity 之 Ping类简析尝试使用

    Ping 什么意思??? [来自百度百科的诠释:] Ping是Windows.Unix和Linux系统下的一个命令.ping也属于一个通信协议,是TCP/IP协议的一部分.利用"ping&q ...

最新文章

  1. 旺铺免费,淘宝的义务不能免
  2. 华人一作统一「视觉-语言」理解与生成:一键生成图像标注,完成视觉问答,Demo可玩...
  3. Cacti on nginx + php-fpm
  4. 颜色传感器TCS230的使用
  5. mysql建立的一个自动更新组织树案案例
  6. hystrix熔断 简介_Hystrix简介– Hello World
  7. 记:使用IScroll.js 开发picker日历组件遇到的问题及经验总结
  8. winform checkedlistbox不显示复选框_据说90%的人都不知道怎么解决这个Word问题
  9. GIT代码管理: git remote add
  10. feathers mysql_Go 语言操作 MySQL 之 CURD 操作
  11. 智能驾驶LQR横向控制算法
  12. 灵活无处安放,所以选择流浪....《漆黑的空间》 《灰色轨迹》
  13. 全渠道客户体验是什么?如何创建全渠道营销平台?
  14. Java语法快速学习-黑马程序员(个人整理版本)
  15. 以太坊中的账户、交易、Gas和区块Gas Limit等基本概念
  16. P4460 [CQOI2018]解锁屏幕
  17. 央视影音大屏版apk下载_央视影音TV版
  18. 支付宝付款页面html,支付页面.html
  19. 时下人间道的生存法则
  20. 学习日记——阿里云物联网平台

热门文章

  1. 如何搭建自己的博客网站(手把手教你搭建免费个人博客网站)
  2. des加密解密 代码 java_java 实现DES 加密解密的示例
  3. uchar 和 uchar3的疑惑
  4. 获取dom元素的方法
  5. vscode运行python没有结果输出
  6. linux 在指定区域分配内存 c语言,C语言动态内存分配:(一)malloc/free的实现及malloc实际分配/释放的内存...
  7. windows2012装sql 2000 sql 2005 vs2005的解决办法
  8. C语言/C++编程学习:和QT零距离接触的意义
  9. DirectShow编程(3.5) - 关于DirectShow - DirectShow中的事件通告
  10. Python 爬抖音