Моя цель: я хочу пинговать каждый 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
Что я могу сделать, чтобы это работало быстрее? Приветствуются любые оптимизации, даже самые небольшие!
Спасибо
nmap может сканировать большие диапазоны адресов…






несколько предложений, примерно в порядке преимуществ:
постарайтесь не запускать «вилочную бомбу»: ваш код пытается запустить 4 миллиарда потоков, каждый из которых порождает процесс. это поставит любой компьютер на колени, вам нужно ограничить себя (максимум) несколькими сотнями процессов одновременно
сами напишите сетевой код. запуск целого потока и процесс для отправки и получения одного сетевого пакета имеет огромные накладные расходы
вы почти наверняка ограничены вводом-выводом, а не процессором, используйте библиотеку asyncio
при условии, что вы написали код, способный отправлять 10 тыс. пакетов в секунду, это все равно займет у вас ~ 5 дней. меня не удивит, если ваш интернет-провайдер довольно быстро заблокирует вас, если вы действительно начнете что-то делать, или, по крайней мере, сильно ограничит скорость / взимает с вас плату за полученные данные
если вы отправите слишком много пингов, вы не получите ответов, они «ненадежны» по замыслу
Лучшая форма оптимизации - это та, которая не связана с кодом: сузьте область действия! Вы, вероятно, уже знаете, но нет сценария, при котором вы когда-либо пинговали бы все миллиарды IP-адресов. Сначала ограничьте объем сети, а затем посмотрите, устраивает ли вас время выполнения :)