Я экспериментировал с пингом разных 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()