Пинг медленнее ожидаемого в питоне - PullRequest
0 голосов
/ 18 мая 2019

Я экспериментировал с пингом разных IP-адресов с использованием многопоточности, но чувствую, что он не работает достаточно быстро, он пингует 3 кбит / с IP-адресов в минуту, что очень медленно, так как мне нужно пропинговать 17 М IP-адресов.Может кто-нибудь сказать мне, что я здесь делаю не так?

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 Ответ

1 голос
/ 18 мая 2019
command = ['ping', '-c', '1', '-n', '1', '-w', '2',  address]

Это не очень подходит для вашей задачи.

Вы были бы счастливее, используя fping . Он быстрый и рад принять несколько целей / диапазонов.

Стоит отметить, что ICMP является протоколом хост-хост, нет номера порта для ядра для демультиплексирования чтобы разрешить передачу пакетов между процессами. Так что, если у вас есть десятки ping дочерних процессов, они все просыпаются на каждом ответном пакете, выполнить тест на равенство и, как правило, отклонить входящий пакет как "не для меня". Так fping, который распознает различные цели, гораздо эффективнее.

...