Как я могу сделать этот многопоточный пингер Python быстрее?

Моя цель: я хочу пинговать каждый IPv4-адрес и записывать, ответили ли они.

Я настроил его так: каждый IP-адрес соответствует индексу. Например, 0.0.0.0 - это индекс 0, а 0.0.1.0 - это индекс 256. Таким образом, если 0.0.0.0 ответил, то нулевой элемент битового массива будет истинным.

Вот код:

import subprocess
from bitarray import bitarray
import threading
import time

response_array = bitarray(256 * 256 * 256 * 256)
response_array.setall(False)

def send_all_pings():
    index = 0
    for f1 in range(256):
        for f2 in range(256):
            for f3 in range(256):
                for f4 in range(256):
                    thread = PingerThread(".".join(map(str, [f1, f2, f3, f4])), index)
                    thread.start()
                    index += 1

    time.sleep(30)
    print("Writing response array to file")
    with open('responses.bin', 'wb') as out:
        response_array.tofile(out)


class PingerThread(threading.Thread):
    def __init__(self, address, index):
        threading.Thread.__init__(self)
        self.address = address
        self.index = index

    def run(self):
        if subprocess.call(["ping", "-c", "1", "-w", "1", self.address]) == 0:
            response_array[self.index] = True
        else:
            response_array[self.index] = False

Что я могу сделать, чтобы это работало быстрее? Приветствуются любые оптимизации, даже самые небольшие!

Спасибо

Лучшая форма оптимизации - это та, которая не связана с кодом: сузьте область действия! Вы, вероятно, уже знаете, но нет сценария, при котором вы когда-либо пинговали бы все миллиарды IP-адресов. Сначала ограничьте объем сети, а затем посмотрите, устраивает ли вас время выполнения :)

KuboMD 06.12.2018 18:47
nmap может сканировать большие диапазоны адресов…
Sam Mason 06.12.2018 19:38
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
34
1

Ответы 1

несколько предложений, примерно в порядке преимуществ:

  1. постарайтесь не запускать «вилочную бомбу»: ваш код пытается запустить 4 миллиарда потоков, каждый из которых порождает процесс. это поставит любой компьютер на колени, вам нужно ограничить себя (максимум) несколькими сотнями процессов одновременно

  2. сами напишите сетевой код. запуск целого потока и процесс для отправки и получения одного сетевого пакета имеет огромные накладные расходы

  3. вы почти наверняка ограничены вводом-выводом, а не процессором, используйте библиотеку asyncio

при условии, что вы написали код, способный отправлять 10 тыс. пакетов в секунду, это все равно займет у вас ~ 5 дней. меня не удивит, если ваш интернет-провайдер довольно быстро заблокирует вас, если вы действительно начнете что-то делать, или, по крайней мере, сильно ограничит скорость / взимает с вас плату за полученные данные

если вы отправите слишком много пингов, вы не получите ответов, они «ненадежны» по замыслу

Другие вопросы по теме