- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我有以下 ip 范围“10.0.0.x”。我需要在这个 ips 范围内循环 - “10.0.0.1-255”,ping 每个 ips,并检查响应。
这是我的代码:
for ip in range(1, 256):
fullIP = '10.0.0' + ip
if(Ping(fullIP) == True):
print(fullIP + ' responded')
else:
print(fullIP + ' did not respond')
此代码有效,但不幸的是它非常慢。
我想通过多线程使其更有效率,所以我做了以下事情:
def PingRange(start, end):
for ip in range(start, end):
fullIP = '10.0.0' + ip
if(Ping(fullIP) == True):
print(fullIP + ' responded')
else:
print(fullIP + ' did not respond')
try:
thread.start_new_thread( PingRange, (1, 123))
thread.start_new_thread( PingRange, (123, 256))
except:
print "Error: unable to start thread"
这段代码也可以工作,但它可以工作得更好,更通用。
如果这段代码写得正确,那么我就不会不断地创建两个线程;我会创建操作系统允许的线程数。
有些计算机允许 8 个线程,有些只允许 4 个,有些甚至不允许线程。
如何让这个程序在 Python 中使用最大数量的线程?
最佳答案
这个问题很适合使用线程池。线程池以恒定数量的线程运行,获取工作项(函数或方法),并在其线程池中执行这些工作项。它具有内置队列,因此如果您将 100 个工作项目分配给一个包含 5 个线程的池,它将执行所有 100 个项目,但不会同时运行超过 5 个。
Python 中有两个内置线程池选项(取决于您使用的版本)- multiprocessing.dummy.Pool
, 和 concurrent.futures.ThreadPoolExecutor
. ThreadPoolExecutor
仅内置于 Python 3.x 中,但可从 PyPI 获得反向移植。 multiprocessing.dummy.Pool
在 2.6+ 中可用。使用 multiprocessing.dummy.Pool
,您的代码变得如此简单:
import multiprocessing.dummy
def ping_range(start, end):
num_threads = # Number of threads to run in the pool.
p = multiprocessing.dummy.Pool(num_threads)
p.map(ping, [10.0.0.x for x in range(start,end)])
if __name__ == "__main__":
PingRange(0, 255)
下一个问题是num_threads
使用什么。我认为您对具有最大允许线程数的系统有轻微误解。您可以在任何系统上创建任意数量的 Thread
对象,实际上没有什么可以阻止您,但在某个时刻您将创建太多系统无法处理的线程它和性能将开始变得更差,而不是更好。
受 CPU 限制的应用程序(意味着它主要需要 CPU 来工作)的经验法则是运行与 CPU 一样多的线程。但是,此 ping 操作是 I/O-bound,这意味着大部分工作是将 ping 请求发送到外部系统,然后等待响应,不需要 CPU 执行任何操作。在这些情况下,通常可以使用超过 CPU 数量的数量。我们可以保守一点,使用 2 * number_of_cpus
,但您可以尝试更大的数字。
import multiprocessing
num_threads = 2 * multiprocessing.cpu_count()
综合起来:
import multiprocessing.dummy
import multiprocessing
def ping(ip):
success = # Run the ping command here
if success:
print("{} responded".format(ip))
else:
print("{} did not respond".format(ip))
return success
def ping_range(start, end):
num_threads = 2 * multiprocessing.cpu_count()
p = multiprocessing.dummy.Pool(num_threads)
p.map(ping, [10.0.0.x for x in range(start,end)])
if __name__ == "__main__":
ping_range(0, 255)
关于python - 如何使用多线程 ping 一个 IP 地址范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29371091/
我们有一个客户想要通过他们的 CRM 数据库并以某种方式确定有效的电话号码,而实际上没有人坐在那里尝试给他们打电话。 有没有办法在电话号码(包括固定电话)上做类似于“ping”的事情? 最佳答案 您将
我知道 ICMP 请求包含 IP 地址。客户端 MAC 地址是否包含在 ICMP 请求中? ping 请求中包含哪些其他信息(如果有)? 最佳答案 ICMP“ping”数据包,正式称为“echo re
据我所知,Ping 命令使用 ICMP 请求 那么是否可以直接从命令行发送带有 ping 命令的短文本? 最佳答案 怎么样ping -p pattern ?请记住,并非所有版本的 ping支持 -p选
我有一个需要持续网络监控的 Android 应用程序,我需要在有互联网和没有互联网时收到通知。我试过 Android 连接管理器,它只告诉互联网 wifi 是否已连接,但不告诉是否有可达性。所以我
我需要检查延迟的服务器拒绝 PING 请求,是否有另一种方法来检查我到服务器的延迟?提前致谢。 最佳答案 使用基于 TCP 的 ping。 如果您可以访问 Windows 框,请使用 http://t
我在 Linux 系统上不允许使用“ping”应用程序(ping:icmp 打开套接字:不允许操作)。但是,我正在编写的脚本(PHP,但如果需要,我可以对任何脚本/程序使用 exec() 调用)需要确
我想创建将通过 ping IP 列表进行验证的 bash 脚本 问题是尽管我将 ping 定义如下,但 ping 到任何地址都需要几秒钟(以防没有 ping 应答): Ping –c 1 126.7
最近几周我做了相当多的研究试图创建一个连接诊断工具,我不太想只检查连接是否可用而是诊断是否存在抖动、数据包丢失等.. 到目前为止,Java 似乎不支持真正的 ICMP 请求,并且有一些解决方法,但没有
我有一个域名要测试。 Ping 约为 20 毫秒。 “HTTP HEAD”约为 500 毫秒。 为什么他们之间有这么大的区别?这是服务器端的问题吗?是不是差别太大了? 25 次。 最佳答案 好吧,首先
我想在 ping 主机后获取 ping 执行时间和结果字符串。我该怎么做? 最佳答案 long currentTime = System.currentTimeMillis(); boolean is
我有以下代码: $Servers = "8.8.8.8" $TimeStart = Get-Date $TimeEnd = $TimeStart.AddMinutes(1) Do { Fore
例如,我输入 ping www.domain.com,我想要的输出如下: 64 bytes from yyy.xxx.com (www.domain.com): icmp_seq=32 ttl=52
在某些设备上,二进制 /system/bin/ping 似乎已被删除。当我通过 USB 连接设备并输入 adb shell ping 它说: /system/bin/sh: ping: not fou
您好,我需要使用 Java 代码执行 PING 命令并获取 ping 主机的摘要。如何用 Java 实现? 最佳答案 按照 viralpatel 的规定,您可以使用 Runtime.exec() 下面
我正在学习 C 中的 ping 实现。问题是,我使用原始套接字来接收数据包。对于所有数据包,我们在 ICMP header 中都有一个标识值。 我在多个终端运行ping。 例如,我在三个终端中运行三个
例如在Windows 7下命令的输出 ping -n 1 ::1 正在关注: Pinging ::1 with 32 bytes of data: Reply from ::1: time<1ms P
我正在制作一个 bash 脚本来配置我们使用的一些设备,但我试图在其中进行登录,换句话说.. 当脚本开始检查日期、时间、用户和其他值,然后 > 这个值到远程服务器中的 csv。 我需要 ping 来检
概念上的区别是什么?是的,我意识到它们都应该产生相似的结果,但我认为环回的想法是它实际上并没有到达堆栈的传输步骤。如果那是真的那么为什么 ping 你自己的 ip 工作得那么快? ping 您自己的地
我正在尝试连接到 Java 中的 URL,看看它们是否有效,我想知道是否需要连接到 HTTPS(端口 443?)或者仅连接到 HTTP(端口 80)就足够了。 连接到 HTTPS 网站是否有效?我应该
我正在尝试 ping 从 192.168.1.1 到 192.168.1.254 的 IP 地址。首先,我使用 InetAddress 类,但它被窃听了,有些 IP 即使可以访问也无法访问。之后我尝试
我是一名优秀的程序员,十分优秀!