我一直在尝试使用多线程对不同的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()
答案 0 :(得分:1)
command = ['ping', '-c', '1', '-n', '1', '-w', '2', address]
这不是您的任务的理想选择。
使用fping会更快乐。 它很快,很高兴接受多个目标/范围。
值得注意的是,ICMP是主机对主机协议,
没有用于内核解复用的端口号
允许进程到进程的数据包分发。
因此,如果您有数十个ping
子进程,
他们全部在每个响应数据包中醒来,
执行平等测试,通常会拒绝
传入的数据包为“不适合我”。
因此fping
可以识别各种目标,
效率更高。