【发布时间】:2017-01-02 12:26:43
【问题描述】:
如何同时 ping 192.168.0.1 - 192.168.0.254?尝试使脚本运行得更快,因为它需要几分钟才能完成。
import os
import subprocess
ip = raw_input("IP Address? ")
print "Scanning IP Address: " + ip
subnet = ip.split(".")
FNULL = open(os.devnull, 'w')
for x in range(1, 255):
ip2 = subnet[0]+"."+ subnet[1] +"."+ subnet[2] +"."+ str(x)
response=subprocess.Popen(["ping", "-c", "1", "-n", "-W", "2", ip2], stdout=FNULL, stderr=subprocess.STDOUT).wait()
if response == 0:
print ip2, 'is up!'
else:
print ip2, 'is down!'
【问题讨论】:
-
查看
multiprocessing模块的Pool。 -
@jacob 不是用于启动和协调一堆 python 进程的多处理池吗?代码已经在启动进程(这是 Popen 所做的),因此您只需启动进程即可启动进程,这将很快变得有趣。
-
@Pyonsuke 是的;但他每次都在这个过程中调用
wait。使用multiprocessing,您可以为每个subprocess.Popen启动一个进程,并且每个进程都可以拥有自己的wait。不是说它是最佳的,但这是我想到的第一件事。 -
远非最佳,您将同时启动 256 个 Python 实例和 255 个 ping 实例,总共 511 个进程。我有点好奇系统是否能正确处理这个问题.尽管您可能正在考虑使用线程模块,它在同一进程中创建“线程”(例如,不使用多个内核,但由于这是 IO 绑定,因此不必这样做)但即使这样仍然很友好过度杀伤,因为最终,Popen 已经开始了一个进程,因此已经有效地启动了“线程”,您可以同时使用 .poll() 和 .wait()
标签: python