ping慢然后在python中预期

时间:2019-05-18 12:08:01

标签: python python-3.x windows multithreading ping

我一直在尝试使用多线程对不同的IP地址执行ping操作,但是我感觉它的速度不够快,每分钟ping大约3k IP,这非常慢,因为我喜欢使用17M IP地址进行ping操作。有人可以告诉我我在做什么错吗?

import sys
from ipaddress import ip_address
from subprocess import Popen, PIPE
from core.thread_pool import ThreadPool

class HostPing:
    def __init__(self):
        self.ok = 0
        self.bad = 0
        self.noresp = 0
        self.response_codes = []
        self.output_codes = []

    def create_ips(self, start, end):
        start_int = int(ip_address(start).packed.hex(), 16)
        end_int = int(ip_address(end).packed.hex(), 16)
        return [ip_address(ip).exploded for ip in range(start_int, end_int)]

    def ping(self, address, **kwargs):
        command = ['ping', '-c', '1', '-n', '1', '-w', '2',  address]
        p = Popen(command, stdin=PIPE, stdout=PIPE, stderr=PIPE)
        output, err = p.communicate(b"input data that is passed to subprocess' stdin")
        res = p.returncode
        output = output.decode().strip()
        if res == 0:
            self.ok += 1
        elif res == 2:
            self.noresp += 1
        else:
            self.bad += 1

        sys.stdout.write("\r OK: {}, Bad: {}, NoResponse: {}".format(self.ok, self.bad, self.noresp))


if __name__ == '__main__':
    api = HostPing()
    ips = api.create_ips("25.0.0.0", "25.255.255.255")
    pool = ThreadPool(30)
    pool.map(api.ping, ips)
    pool.wait_completion()

1 个答案:

答案 0 :(得分:1)

command = ['ping', '-c', '1', '-n', '1', '-w', '2',  address]

这不是您的任务的理想选择。

使用fping会更快乐。 它很快,很高兴接受多个目标/范围。

值得注意的是,ICMP是主机对主机协议, 没有用于内核解复用的端口号 允许进程到进程的数据包分发。 因此,如果您有数十个ping子进程, 他们全部每个响应数据包中醒来, 执行平等测试,通常会拒绝 传入的数据包为“不适合我”。 因此fping可以识别各种目标, 效率更高。