需求背景:

部门内部一个监控项目需要快速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. 08-图7 公路村村通
  2. 进程死锁的危害、导致原因和解决方法
  3. Spring(IOC+AOP)
  4. c#windows消息循环sendmessage实例
  5. Performance Tuning
  6. Error:配置系统未能初始化
  7. Python函数调用的九大方法,鲜为人知
  8. 计算机yiji教案,剑桥一级下册详细教案
  9. cisco配置和ios备份
  10. Unity3D:2D角色移动篇2:动画的添加
  11. 蕃茄工作法 - 让你轻松应对繁忙的工作
  12. disk-磁盘检测工具(二合一)
  13. Linux网络开始收发包之前需要做的事情——创建ksoftirqd内核进程
  14. Breakpoint原理解释
  15. 认证模式之Digest模式
  16. 30岁是全新的20岁?---《20岁时光不再来》
  17. CCS 2022 极客少年挑战赛 writeup
  18. 新品周刊 | ​内外、UR、迪士尼商店、Kipling、资生堂、林清轩等女王节新品发布...
  19. Python 列表、元素、字典
  20. JAVA编程实现猜数游戏

热门文章

  1. 2022.04.04树莓派最新镜像问题,树莓派如何设置初始化的账户和密码
  2. mysql 1701,MySQL ERROR 1701 (42000)
  3. C语言中经典算法——斐波那契数列的几种算法
  4. 如何从request中获取域名
  5. 做开发遇到35岁瓶颈被裁员,体验了一把“自由职业”,最后入行了软件测试...
  6. type="button" ,"submit" 的区别
  7. 华为南研所2014春季机试题目-2不能入住的房客数
  8. C++函数UpdateData()有什么作用?
  9. SSL单向、双向认证
  10. 利用matlab的interp1()对矩阵进行插值