ping速度比python中预期的慢
我一直在尝试使用多线程ping不同的IP地址,但我觉得它不够快,它每分钟ping 3 K的IP,这是非常慢的,因为我有1700万个IP地址要ping。谁能告诉我我做错了什么ping速度比python中预期的慢,python,python-3.x,windows,multithreading,ping,Python,Python 3.x,Windows,Multithreading,Ping,我一直在尝试使用多线程ping不同的IP地址,但我觉得它不够快,它每分钟ping 3 K的IP,这是非常慢的,因为我有1700万个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):
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()
这不适合你的任务
你会更乐意使用它。
它速度快,并且乐于接受多个目标/范围
值得注意的是,ICMP是一种主机对主机协议,
内核没有要解复用的端口号
允许进程到进程的数据包调度。
因此,如果您有几十个ping
子进程,
他们都在每个响应数据包上醒来,
执行相等性测试,通常拒绝
传入的数据包为“不适合我”。
因此fping,能够识别不同的目标,
效率要高得多。这是一个I/O绑定任务,因为您正在等待从主机发送和接收数据包,考虑到最适合I/O绑定任务,可能最好采用异步方法,无论您有1700万台主机进行ping,仍然需要一些时间。似乎可以加快异步。据我所知,Win操作系统不支持Tnx for input.fping。但你确实给了我一些合作的想法。
command = ['ping', '-c', '1', '-n', '1', '-w', '2', address]