ping ~ 100,000 个服务器,多线程还是多处理更好?

Alb*_*ino 5 python multithreading ping python-multithreading python-multiprocessing

我创建了一个简单的脚本,它遍历我需要 ping 和 nslookup 的服务器列表。问题是,ping 可能需要一些时间,尤其是 ping 比一天中的秒数更多的服务器。

我对编程相当陌生,我知道多处理或多线程可能是使我的工作运行得更快的解决方案。

我的计划是获取我的服务器列表和 1. 将它分成大小均匀的列表,列表的数量与线程/进程匹配,或者 2. 如果这些选项之一支持它,则遍历单个列表,每个列表都传递一个新的在完成之前的 ping 和 nslookup 后,线程或进程的服务器名称。这是可取的,因为它确保我花费最少的时间,就好像列表 1 有 200 个离线服务器而列表 6 有 2000 个,它需要等待使用列表 6 的过程完成,即使所有其他人在那个时候都是免费的观点。

  1. 哪一个更适合这项任务,为什么?

  2. 如果可能,我将如何确保每个线程或进程具有基本相同的运行时

代码片段即使现在相当简单

import subprocess
import time
server_file = open(r"myfilepath", "r")
initial_time = time.time()
for i in range(1000):
    print(server_file.readline()[0:-1]+ ' '+str(subprocess.run('ping '+server_file.readline()[0:-1]).returncode)) #This returns a string with the server name, and return code,
print(time.time()-initial_time)
Run Code Online (Sandbox Code Playgroud)

出现此问题是因为每次失败的 ping 平均需要 3 秒以上。此外,我知道不放置打印语句会使它更快,但我想监视它的一个小案例。我正在对 100,000 台服务器的影响进行 ping 操作,这将需要定期执行,并且该列表将继续增长

rus*_*tyx 6

为了获得最佳性能,您既不想要;对于 100,000 个活动作业,最好在单个或可能的少数线程或进程中使用异步处理(但不超过可用内核的数量)。

使用异步 I/O,许多网络任务可以在单个线程中执行,由于节省了上下文切换(也就是说,您理论上可以在 1 秒内 ping 100,000 台机器),轻松实现 100,000 或更高的速率。

Python 支持异步 I/O 通过asyncio这里是asyncio 和协程一个很好的介绍)。

不依赖于外部进程(如 )也很重要ping,因为生成新进程是一项非常昂贵的操作。

aioping是使用本机 Python ping 的示例asyncio(请注意,ping实际上是一对 ICMP 请求/回复数据包)。应该很容易调整它以同时执行多个 ping。


Yoe*_*nov 5

太长了;多线程是适合您的解决方案 - 线程模块使用线程,多处理模块使用进程。不同之处在于线程运行在相同的内存空间中,而进程则拥有单独的内存。

至于问题1——

对于 IO 任务,例如查询数据库或加载网页,CPU 只是等待答案而不执行任何操作,这会浪费资源,因此多线程就是答案(:

至于问题2——

您只需创建线程池来管理它们同时运行,而无需费尽心思。