【问题标题】:Sending multiple pings with Python使用 Python 发送多个 ping
【发布时间】: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


【解决方案1】:

您可以一次启动所有进程并将它们保存在一个列表中,而不是等待循环中的每个进程完成:

processes = []

for x in range(1, 255):
    ip2 = subnet[0]+"."+ subnet[1] +"."+ subnet[2] +"."+ str(x)
    process = subprocess.Popen(["ping", "-c", "1", "-n", "-W", "2", ip2], stdout=FNULL, stderr=subprocess.STDOUT)
    processes.append((ip2, process))

然后您可以等待每个过程完成并打印结果:

for ip2, process in processes:
    response = process.wait()
    if response == 0:
        print ip2, 'is up!'
    else:
        print ip2, 'is down!'

【讨论】:

    【解决方案2】:

    看看你用来得到响应的方法:

    response=subprocess.Popen(["ping", "-c", "1", "-n", "-W", "2", ip2], stdout=FNULL, stderr=subprocess.STDOUT).wait()
    

    最重要的是,末尾的.wait() 意味着您的程序将等待进程完成。

    通过将 Popen(而不是等待)的结果放入列表中,您可以一次启动 255 个进程(尽管您可能希望启动较小的块以保持理智):

    processes = []
    for ip8 in range(1, 255):
        ip32 = subnet[0]+"."+ subnet[1] +"."+ subnet[2] +"."+ str(ip8)
        process = subprocess.Popen(["ping", "-c", "1", "-n", "-W", "2", ip32], stdout=FNULL, stderr=subprocess.STDOUT)
        processes.append(process)
    

    然后您可以完成每个过程并等待它们完成:

    for process, ip8 in zip(processes, range(1, 255)):
        ip32 = subnet[0]+"."+ subnet[1] +"."+ subnet[2] +"."+ str(ip8)
        response = process.wait()
        if response == 0:
            print("%s is up!" % (ip32))
        else:
            print("%s is down!" % (ip32))
    

    【讨论】:

      【解决方案3】:

      或者您可以通过一次 ping 到子网广播地址来 ping 它们全部。因此,如果您的子网是 255.255.255.0(也称为 /24),那么只需 ping 192.168.0.255通常每个人都会 ping 回来。

      【讨论】:

        猜你喜欢
        • 2022-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多